<?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=3696_-_taxa</id>
	<title>3696 - taxa - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3696_-_taxa"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3696_-_taxa&amp;action=history"/>
	<updated>2026-05-01T06:40:30Z</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=3696_-_taxa&amp;diff=9703&amp;oldid=prev</id>
		<title>Aurelia Raluca at 20:40, 22 March 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3696_-_taxa&amp;diff=9703&amp;oldid=prev"/>
		<updated>2024-03-22T20:40:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;//wiki.universitas.ro/index.php?title=3696_-_taxa&amp;amp;diff=9703&amp;amp;oldid=9304&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3696_-_taxa&amp;diff=9304&amp;oldid=prev</id>
		<title>Aurelia Raluca: Pagină nouă: == Enunt ==  Miruna se pregăteşte de vacanţa de vară. Ea a hotărât deja că împreună cu un grup de colegi să facă o excursie în regatul INFO unde moneda locală se numeşte BOSS. A studiat deja harta acestei zone şi a aflat multe lucruri interesante. Ea ştie că regatul se află pe o insula cu suprafaţa uscatului sub forma dreptunghiulară ce poate fi reprezentată ca o matrice cu N linii şi M coloane în care fiecare element este un cod pentru un tip de obiect...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3696_-_taxa&amp;diff=9304&amp;oldid=prev"/>
		<updated>2024-01-09T08:59:35Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Enunt ==  Miruna se pregăteşte de vacanţa de vară. Ea a hotărât deja că împreună cu un grup de colegi să facă o excursie în regatul INFO unde moneda locală se numeşte BOSS. A studiat deja harta acestei zone şi a aflat multe lucruri interesante. Ea ştie că regatul se află pe o insula cu suprafaţa uscatului sub forma dreptunghiulară ce poate fi reprezentată ca o matrice cu N linii şi M coloane în care fiecare element este un cod pentru un tip de obiect...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Miruna se pregăteşte de vacanţa de vară. Ea a hotărât deja că împreună cu un grup de colegi să facă o excursie în regatul INFO unde moneda locală se numeşte BOSS. A studiat deja harta acestei zone şi a aflat multe lucruri interesante. Ea ştie că regatul se află pe o insula cu suprafaţa uscatului sub forma dreptunghiulară ce poate fi reprezentată ca o matrice cu N linii şi M coloane în care fiecare element este un cod pentru un tip de obiectiv turistic ce poate fi vizitat. Deoarece sosirea şi plecarea de pe insulă se face cu avionul, ea cunoaşte poziția (l0,c0) unde va fi debarcată şi poziţia (lf,cf) unde va fi plecarea de pe insulă. Ea se poate deplasa pentru vizitarea obiectivelor turistice doar în celule vecine pe cele opt direcţii (N, S, E, V, NE, NV, SE, SV), iar dacă nouă poziţie are alt cod decât cel din care venise la pasul precedent, atunci trebuie să plătească o taxa de vizitare egală cu produsul codurilor celor doua zone (exprimată tot în moneda locală, BOSS!!!). Miruna ar dori să afle care ar fi suma minimă necesară pentru a se deplasa până la locul de plecare de pe insulă.&lt;br /&gt;
&lt;br /&gt;
== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
Dându-se configuraţia regatului şi poziţiile de plecare şi sosire, să se determine suma minimă necesară deplasării.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Pe prima linie a fişierului taxa.in se află valorile naturale N, M, l0, c0, lf, cf. Pe următoarele N linii se află câte M elemente, codurile fiecărei zone, numere naturale separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de ieșire taxa.out va conține un număr natural B, reprezentând suma minimă necesară deplasării.&lt;br /&gt;
&lt;br /&gt;
== Restrictii si precizari ==&lt;br /&gt;
&lt;br /&gt;
*0 &amp;lt; N, M &amp;lt; 1001&lt;br /&gt;
*Obiectivele au coduri numere naturale nenule mai mici sau egale cu 5, iar poziţia inițială şi finală sunt distincte&lt;br /&gt;
*Pentru 30% din teste vom avea N, M ≤ 100&lt;br /&gt;
*Pentru 20% din teste matricea conţine numai două valori.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
;taxain.txt&lt;br /&gt;
&lt;br /&gt;
:5 5 1 1 4 5&lt;br /&gt;
&lt;br /&gt;
:1 1 2 2 2&lt;br /&gt;
&lt;br /&gt;
:1 2 3 3 3&lt;br /&gt;
&lt;br /&gt;
:1 1 3 3 3&lt;br /&gt;
&lt;br /&gt;
:2 2 2 2 2&lt;br /&gt;
&lt;br /&gt;
:1 1 1 2 1&lt;br /&gt;
&lt;br /&gt;
;taxaout.txt&lt;br /&gt;
&lt;br /&gt;
:Datele introduse corespund restrictiilor impuse.&lt;br /&gt;
&lt;br /&gt;
:2&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
&lt;br /&gt;
;taxain.txt&lt;br /&gt;
&lt;br /&gt;
:86 453 53 4&lt;br /&gt;
&lt;br /&gt;
:-3 32 0 -3&lt;br /&gt;
&lt;br /&gt;
:22 9 323 43&lt;br /&gt;
&lt;br /&gt;
:12 94 732 43&lt;br /&gt;
&lt;br /&gt;
:-2 -3 -34 -4&lt;br /&gt;
&lt;br /&gt;
:12 32  43 65&lt;br /&gt;
&lt;br /&gt;
;taxaout.txt&lt;br /&gt;
&lt;br /&gt;
:Datele de intrare nu corespund restrictiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def suma_minima_deplasare(regat, sosire, plecare):&lt;br /&gt;
    N = len(regat)&lt;br /&gt;
    M = len(regat[0])&lt;br /&gt;
&lt;br /&gt;
    # Pasul 1: Construirea grafului&lt;br /&gt;
    graf = construieste_graf(regat, N, M)&lt;br /&gt;
&lt;br /&gt;
    # Pasul 2: Calculul drumului minim&lt;br /&gt;
    suma_minima = dijkstra(graf, sosire, plecare)&lt;br /&gt;
&lt;br /&gt;
    return suma_minima&lt;br /&gt;
&lt;br /&gt;
def construieste_graf(regat, N, M):&lt;br /&gt;
    graf = {}&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            cod_curent = regat[i][j]&lt;br /&gt;
            nod_curent = (i, j)&lt;br /&gt;
&lt;br /&gt;
            if nod_curent not in graf:&lt;br /&gt;
                graf[nod_curent] = {}&lt;br /&gt;
&lt;br /&gt;
            vecini = get_vecini(N, M, i, j)&lt;br /&gt;
            for vecin in vecini:&lt;br /&gt;
                i_vecin, j_vecin = vecin&lt;br /&gt;
                cod_vecin = regat[i_vecin][j_vecin]&lt;br /&gt;
                cost = cod_curent * cod_vecin&lt;br /&gt;
                nod_vecin = (i_vecin, j_vecin)&lt;br /&gt;
&lt;br /&gt;
                if nod_vecin not in graf[nod_curent]:&lt;br /&gt;
                    graf[nod_curent][nod_vecin] = cost&lt;br /&gt;
&lt;br /&gt;
    return graf&lt;br /&gt;
&lt;br /&gt;
def get_vecini(N, M, i, j):&lt;br /&gt;
    vecini = []&lt;br /&gt;
&lt;br /&gt;
    for di in [-1, 0, 1]:&lt;br /&gt;
        for dj in [-1, 0, 1]:&lt;br /&gt;
            if di == 0 and dj == 0:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            i_vecin, j_vecin = i + di, j + dj&lt;br /&gt;
            if 0 &amp;lt;= i_vecin &amp;lt; N and 0 &amp;lt;= j_vecin &amp;lt; M:&lt;br /&gt;
                vecini.append((i_vecin, j_vecin))&lt;br /&gt;
&lt;br /&gt;
    return vecini&lt;br /&gt;
&lt;br /&gt;
def dijkstra(graf, sosire, plecare):&lt;br /&gt;
    distante = {nod: float(&amp;#039;inf&amp;#039;) for nod in graf}&lt;br /&gt;
    distante[sosire] = 0&lt;br /&gt;
&lt;br /&gt;
    heap = [(0, sosire)]&lt;br /&gt;
&lt;br /&gt;
    while heap:&lt;br /&gt;
        cost_curent, nod_curent = heapq.heappop(heap)&lt;br /&gt;
&lt;br /&gt;
        if cost_curent &amp;gt; distante[nod_curent]:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        for vecin, cost in graf[nod_curent].items():&lt;br /&gt;
            cost_total = cost_curent + cost&lt;br /&gt;
&lt;br /&gt;
            if cost_total &amp;lt; distante[vecin]:&lt;br /&gt;
                distante[vecin] = cost_total&lt;br /&gt;
                heapq.heappush(heap, (cost_total, vecin))&lt;br /&gt;
&lt;br /&gt;
    return distante[plecare]&lt;br /&gt;
&lt;br /&gt;
rezultat = suma_minima_deplasare(regat, sosire, plecare)&lt;br /&gt;
print(rezultat)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
</feed>