<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=4013_-_CMGB</id>
	<title>4013 - CMGB - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=4013_-_CMGB"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4013_-_CMGB&amp;action=history"/>
	<updated>2026-05-01T08:48:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4013_-_CMGB&amp;diff=9139&amp;oldid=prev</id>
		<title>Rus Marius: Pagină nouă: == Enunț == Cunoscutul programator Văndămel are la dispoziție o matrice binară cu &lt;code&gt;n&lt;/code&gt; linii (numerotate de la &lt;code&gt;1&lt;/code&gt; la &lt;code&gt;n&lt;/code&gt;) și &lt;code&gt;m&lt;/code&gt; coloane (numerotate de la &lt;code&gt;1&lt;/code&gt; la &lt;code&gt;m&lt;/code&gt;). Văndămel poate efectua, de câte ori e posibil, următoarea operație: alege două poziții vecine pe linie sau pe coloană și care conțin ambele valoarea &lt;code&gt;1&lt;/code&gt; și le transformă în &lt;code&gt;0&lt;/code&gt;. De exemplu, în matricea:...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4013_-_CMGB&amp;diff=9139&amp;oldid=prev"/>
		<updated>2024-01-06T20:22:14Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Enunț == Cunoscutul programator Văndămel are la dispoziție o matrice binară cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;) și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;). Văndămel poate efectua, de câte ori e posibil, următoarea operație: alege două poziții vecine pe linie sau pe coloană și care conțin ambele valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și le transformă în &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. De exemplu, în matricea:...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Enunț ==&lt;br /&gt;
Cunoscutul programator Văndămel are la dispoziție o matrice binară cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;) și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;). Văndămel poate efectua, de câte ori e posibil, următoarea operație: alege două poziții vecine pe linie sau pe coloană și care conțin ambele valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și le transformă în &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. De exemplu, în matricea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 1 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 1 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 0 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 1 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
el poate alege valorile de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; de la pozițiile vecine &amp;lt;code&amp;gt;(1,2)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(2,2)&amp;lt;/code&amp;gt;, le transformă în &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și obține matricea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 0 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 0 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 0 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 1 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Văndămel știe să rezolve orice problemă, dar vrea să vadă dacă știți și voi să aflați numărul maxim posibil de operații care se pot efectua pe matricea dată.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și de pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; numere binare reprezentând valorile din matrice.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran un singur număr natural reprezentând numărul maxim posibil de operații care se pot aplica asupra matricei.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n, m ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 4 4&lt;br /&gt;
 0 1 1 0&lt;br /&gt;
 1 1 0 0&lt;br /&gt;
 1 0 0 0&lt;br /&gt;
 0 1 1 0&lt;br /&gt;
Ieșire&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se efectuează operațiile la &amp;lt;code&amp;gt;(2,1)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(3,1)&amp;lt;/code&amp;gt;, la &amp;lt;code&amp;gt;(1,2)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(2,2)&amp;lt;/code&amp;gt; și la &amp;lt;code&amp;gt;(4,2)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(4,3)&amp;lt;/code&amp;gt;. După efectuarea celor &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; operații matricea arată astfel:&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 101 101&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Nmax = 100001&lt;br /&gt;
&lt;br /&gt;
oo = 1 &amp;lt;&amp;lt; 28&lt;br /&gt;
VI = list[int]&lt;br /&gt;
&lt;br /&gt;
n, m, p, v, im = 0, 0, 0, 0, 0&lt;br /&gt;
M = [[0]*202 for _ in range(202)]&lt;br /&gt;
A = [[0]*202 for _ in range(202)]&lt;br /&gt;
U = [0]*10001&lt;br /&gt;
D = [0]*10001&lt;br /&gt;
Vis = [False] * Nmax&lt;br /&gt;
V = [[] for _ in range(Nmax)]&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= m &amp;lt;= 100):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def cupleaza(v):&lt;br /&gt;
    if Vis[v]:&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    Vis[v] = 1&lt;br /&gt;
&lt;br /&gt;
    for x in V[v]:&lt;br /&gt;
        if not D[x]:&lt;br /&gt;
            U[v] = x&lt;br /&gt;
            D[x] = v&lt;br /&gt;
            return True&lt;br /&gt;
    &lt;br /&gt;
    for x in V[v]:&lt;br /&gt;
        if cupleaza(D[x]):&lt;br /&gt;
            U[v] = x&lt;br /&gt;
            D[x] = v&lt;br /&gt;
            return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global n, m, p, v, im, M, A, U, D, Vis, V&lt;br /&gt;
&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    if not check_constraints(n, m):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        row = list(map(int, input().split()))&lt;br /&gt;
        for j in range(1, m + 1):&lt;br /&gt;
            M[i][j] = row[j - 1]&lt;br /&gt;
&lt;br /&gt;
            if M[i][j] == 1:&lt;br /&gt;
                if (i + j) % 2 == 0:&lt;br /&gt;
                    p += 1&lt;br /&gt;
                    A[i][j] = p&lt;br /&gt;
                else:&lt;br /&gt;
                    im += 1&lt;br /&gt;
                    A[i][j] = im&lt;br /&gt;
            &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(1, m + 1):&lt;br /&gt;
            if M[i][j] == 1 and (i + j) % 2 == 0:&lt;br /&gt;
                if M[i + 1][j]: V[A[i][j]].append(A[i + 1][j])&lt;br /&gt;
                if M[i][j + 1]: V[A[i][j]].append(A[i][j + 1])&lt;br /&gt;
                if M[i - 1][j]: V[A[i][j]].append(A[i - 1][j])&lt;br /&gt;
                if M[i][j - 1]: V[A[i][j]].append(A[i][j - 1])&lt;br /&gt;
    &lt;br /&gt;
    done = 0&lt;br /&gt;
    ans = 0&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        done = 1&lt;br /&gt;
&lt;br /&gt;
        for i in range(p + 1):&lt;br /&gt;
            Vis[i] = 0&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, p + 1):&lt;br /&gt;
            if U[i] == 0 and cupleaza(i):&lt;br /&gt;
                ans += 1&lt;br /&gt;
                done = 0&lt;br /&gt;
&lt;br /&gt;
    print(ans)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
</feed>