<?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=2140_-_Poartas</id>
	<title>2140 - Poartas - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2140_-_Poartas"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2140_-_Poartas&amp;action=history"/>
	<updated>2026-05-01T06:49:43Z</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=2140_-_Poartas&amp;diff=10187&amp;oldid=prev</id>
		<title>RaulOtet: Pagină nouă: Se consideră harta universului ca fiind o matrice cu &lt;code&gt;250&lt;/code&gt; de linii și &lt;code&gt;250&lt;/code&gt; de coloane. În fiecare celulă se găsește o așa numită poartă stelară, iar în anumite celule se găsesc echipaje ale porții stelare. La o deplasare, un echipaj se poate deplasa din locul în care se află în oricare alt loc în care se găsește o a doua poartă, în cazul nostru în orice altă poziție din matrice. Nu se permite situarea simultană a mai mult de un...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2140_-_Poartas&amp;diff=10187&amp;oldid=prev"/>
		<updated>2024-07-26T08:14:12Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Se consideră harta universului ca fiind o matrice cu &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de linii și &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de coloane. În fiecare celulă se găsește o așa numită poartă stelară, iar în anumite celule se găsesc echipaje ale porții stelare. La o deplasare, un echipaj se poate deplasa din locul în care se află în oricare alt loc în care se găsește o a doua poartă, în cazul nostru în orice altă poziție din matrice. Nu se permite situarea simultană a mai mult de un...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Se consideră harta universului ca fiind o matrice cu &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de linii și &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de coloane. În fiecare celulă se găsește o așa numită poartă stelară, iar în anumite celule se găsesc echipaje ale porții stelare. La o deplasare, un echipaj se poate deplasa din locul în care se află în oricare alt loc în care se găsește o a doua poartă, în cazul nostru în orice altă poziție din matrice. Nu se permite situarea simultană a mai mult de un echipaj într o celulă. La un moment dat un singur echipaj se poate deplasa de la o poartă stelară la alta.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se un număr &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; de echipaje, pentru fiecare echipaj fiind precizate poziția inițială și poziția finală, determinați numărul minim de deplasări necesare pentru ca toate echipajele să ajungă din poziția inițială în cea finală.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;poartas.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; reprezentând numărul  echipaje, iar pe următoarele &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale, primele două reprezentând coordonatele poziției inițiale a unui echipaj (linie coloană), următoarele două reprezentând coordonatele poziției finale a aceluiași echipaj (linie coloană).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;poartas.out&amp;lt;/code&amp;gt; va conține un singur număr reprezentând numărul minim de deplasări necesar.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* coordonatele pozițiilor inițiale și finale ale echipajelor sunt numere naturale din intervalul &amp;lt;code&amp;gt;[1, 250]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; p &amp;lt; 5000&amp;lt;/code&amp;gt;&lt;br /&gt;
* pozițiile inițiale ale celor &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; echipaje sunt distincte două câte două&lt;br /&gt;
* pozițiile finale ale celor &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; echipaje sunt distincte două câte două&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;poartas.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 2 3 4&lt;br /&gt;
 6 5 3 9&lt;br /&gt;
 3 4 1 2&lt;br /&gt;
&amp;lt;code&amp;gt;poartas.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire_date(nume_fisier):&lt;br /&gt;
    import sys&lt;br /&gt;
    input = sys.stdin.read&lt;br /&gt;
    data = input().strip().split()&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem datele&lt;br /&gt;
    index = 0&lt;br /&gt;
    p = int(data[index])&lt;br /&gt;
    index += 1&lt;br /&gt;
    echipaje = []&lt;br /&gt;
    for _ in range(p):&lt;br /&gt;
        x1, y1, x2, y2 = map(int, data[index:index+4])&lt;br /&gt;
        echipaje.append(((x1, y1), (x2, y2)))&lt;br /&gt;
        index += 4&lt;br /&gt;
    &lt;br /&gt;
    return p, echipaje&lt;br /&gt;
&lt;br /&gt;
def floyd_warshall(dist, noduri):&lt;br /&gt;
    # Aplicam algoritmul lui Floyd-Warshall pentru toate perechile de noduri&lt;br /&gt;
    for k in range(noduri):&lt;br /&gt;
        for i in range(noduri):&lt;br /&gt;
            for j in range(noduri):&lt;br /&gt;
                if dist[i][j] &amp;gt; dist[i][k] + dist[k][j]:&lt;br /&gt;
                    dist[i][j] = dist[i][k] + dist[k][j]&lt;br /&gt;
&lt;br /&gt;
def numar_minim_deplasari(p, echipaje):&lt;br /&gt;
    # Initializare matrice de distante mari (infinite)&lt;br /&gt;
    INF = float(&amp;#039;inf&amp;#039;)&lt;br /&gt;
    # Creem un dictionar pentru a stoca distantele intre porțile stelare&lt;br /&gt;
    noduri = {}&lt;br /&gt;
    index_nod = 0&lt;br /&gt;
    for ((x1, y1), (x2, y2)) in echipaje:&lt;br /&gt;
        if (x1, y1) not in noduri:&lt;br /&gt;
            noduri[(x1, y1)] = index_nod&lt;br /&gt;
            index_nod += 1&lt;br /&gt;
        if (x2, y2) not in noduri:&lt;br /&gt;
            noduri[(x2, y2)] = index_nod&lt;br /&gt;
            index_nod += 1&lt;br /&gt;
&lt;br /&gt;
    num_noduri = len(noduri)&lt;br /&gt;
    dist = [[INF] * num_noduri for _ in range(num_noduri)]&lt;br /&gt;
&lt;br /&gt;
    # Setam distanta de la un nod la sine insusi la 0&lt;br /&gt;
    for i in range(num_noduri):&lt;br /&gt;
        dist[i][i] = 0&lt;br /&gt;
&lt;br /&gt;
    # Setam distantele initiale (doar distanta directa dintre noduri)&lt;br /&gt;
    for ((x1, y1), (x2, y2)) in echipaje:&lt;br /&gt;
        nod1 = noduri[(x1, y1)]&lt;br /&gt;
        nod2 = noduri[(x2, y2)]&lt;br /&gt;
        dist[nod1][nod2] = 1&lt;br /&gt;
        dist[nod2][nod1] = 1&lt;br /&gt;
    &lt;br /&gt;
    floyd_warshall(dist, num_noduri)&lt;br /&gt;
&lt;br /&gt;
    total_deplasari = 0&lt;br /&gt;
    for ((x1, y1), (x2, y2)) in echipaje:&lt;br /&gt;
        nod1 = noduri[(x1, y1)]&lt;br /&gt;
        nod2 = noduri[(x2, y2)]&lt;br /&gt;
        total_deplasari += dist[nod1][nod2]&lt;br /&gt;
    &lt;br /&gt;
    return total_deplasari&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultate(nume_fisier, total_deplasari):&lt;br /&gt;
    with open(nume_fisier, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{total_deplasari}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Main function&lt;br /&gt;
def main():&lt;br /&gt;
    p, echipaje = citire_date(&amp;#039;date.in&amp;#039;)&lt;br /&gt;
    total_deplasari = numar_minim_deplasari(p, echipaje)&lt;br /&gt;
    scrie_rezultate(&amp;#039;date.out&amp;#039;, total_deplasari)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
</feed>