<?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=2041_-_Camelot</id>
	<title>2041 - Camelot - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2041_-_Camelot"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2041_-_Camelot&amp;action=history"/>
	<updated>2026-05-01T08:48:35Z</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=2041_-_Camelot&amp;diff=9140&amp;oldid=prev</id>
		<title>Rus Marius: Pagină nouă: = Cerința = Regele Arthur – Inimă de Leu, vrea să adune la castel toţi cavalerii &#039;&#039;Mesei Rotunde&#039;&#039; pentru a hotărî împreună soarta regatului. Dar cavalerii nu se află toţi în &#039;&#039;Camelot&#039;&#039; şi durează un timp până vor ajunge la castel din pădurea care înconjoară castelul.  Harta pădurii are forma unei matrici, cu &lt;code&gt;m&lt;/code&gt; linii şi &lt;code&gt;n&lt;/code&gt; coloane. Pentru fiecare cavaler care nu este în &#039;&#039;Camelot&#039;&#039; se cunosc coordonatele &lt;code&gt;x y&lt;/code&gt;, repre...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2041_-_Camelot&amp;diff=9140&amp;oldid=prev"/>
		<updated>2024-01-06T20:32:36Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: = Cerința = Regele Arthur – Inimă de Leu, vrea să adune la castel toţi cavalerii &amp;#039;&amp;#039;Mesei Rotunde&amp;#039;&amp;#039; pentru a hotărî împreună soarta regatului. Dar cavalerii nu se află toţi în &amp;#039;&amp;#039;Camelot&amp;#039;&amp;#039; şi durează un timp până vor ajunge la castel din pădurea care înconjoară castelul.  Harta pădurii are forma unei matrici, cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane. Pentru fiecare cavaler care nu este în &amp;#039;&amp;#039;Camelot&amp;#039;&amp;#039; se cunosc coordonatele &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, repre...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Cerința =&lt;br /&gt;
Regele Arthur – Inimă de Leu, vrea să adune la castel toţi cavalerii &amp;#039;&amp;#039;Mesei Rotunde&amp;#039;&amp;#039; pentru a hotărî împreună soarta regatului. Dar cavalerii nu se află toţi în &amp;#039;&amp;#039;Camelot&amp;#039;&amp;#039; şi durează un timp până vor ajunge la castel din pădurea care înconjoară castelul.&lt;br /&gt;
&lt;br /&gt;
Harta pădurii are forma unei matrici, cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane. Pentru fiecare cavaler care nu este în &amp;#039;&amp;#039;Camelot&amp;#039;&amp;#039; se cunosc coordonatele &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, reprezentând linia şi coloana din matrice în care se află iniţial cavalerul. Toţi cavalerii pornesc simultan spre castel, iar fiecare cavaler se deplasează după regula de deplasare a calului de la jocul de şah.&lt;br /&gt;
&lt;br /&gt;
Cunoscând dimensiunile &amp;lt;code&amp;gt;mxn&amp;lt;/code&amp;gt; ale matricei, coordonatele castelului şi cele ale cavalerilor, se cere să se determine:&lt;br /&gt;
&lt;br /&gt;
1. numărul minim de mutări după care va ajunge la castel unul dintre cavaleri&lt;br /&gt;
&lt;br /&gt;
2. numărul minim de mutări după care toţi cavalerii se vor afla la castel.&lt;br /&gt;
&lt;br /&gt;
De exemplu, în imaginea de mai sus este reprezentată harta sub forma unei matrici de tip &amp;lt;code&amp;gt;8x8&amp;lt;/code&amp;gt;, iar castelul are coordonatele &amp;lt;code&amp;gt;4 5&amp;lt;/code&amp;gt; (linia &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;), primul cavaler se află iniţial în punctul de coordonate &amp;lt;code&amp;gt;1 2&amp;lt;/code&amp;gt; iar cel de al doilea în punctul &amp;lt;code&amp;gt;8 1&amp;lt;/code&amp;gt;. Primul cavaler va ajunge la castel din minim &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; deplasări, iar al doilea după minim &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mutări Pentru prima întrebare răspunsul este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, iar pentru a doua întrebare răspunsul este &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;camelotIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, pentru toate testele de intrare numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; putând avea doar valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe cea de a doua linie sunt scrise numerele naturale &amp;lt;code&amp;gt;m n k&amp;lt;/code&amp;gt;, separate prin câte un spaţiu, iar pe a treia linie se află coordonatele &amp;lt;code&amp;gt;xc yc&amp;lt;/code&amp;gt; ale castelului. Pe următoarele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii se află &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; perechi de numere întregi &amp;lt;code&amp;gt;x[i] y[i]&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;), separate prin câte un spaţiu, reprezentând coordonatele cavalerilor.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;camelotOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie:&lt;br /&gt;
&lt;br /&gt;
* pentru &amp;lt;code&amp;gt;p=1&amp;lt;/code&amp;gt;, pe prima linie se va scrie numărul minim de mutări după care va ajunge unul din cavaleri&lt;br /&gt;
* pentru &amp;lt;code&amp;gt;p=2&amp;lt;/code&amp;gt;, pe prima linie se va scrie numărul minim de mutări după care vor ajunge toţi cavalerii. Î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;5 ≤ m,n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ x[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xc ≤ m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ y[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yc ≤ n&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;&lt;br /&gt;
* Eventualele intersecţii ale drumurilor cavalerilor nu influenţează rezultatele&lt;br /&gt;
* Pentru datele de test se garantează existenţa unei soluţii&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;camelotIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 8 8 2&lt;br /&gt;
 4 5&lt;br /&gt;
 1 2&lt;br /&gt;
 8 1&lt;br /&gt;
&amp;lt;code&amp;gt;camelotOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;camelotIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 1001 8 2&lt;br /&gt;
 4 5&lt;br /&gt;
 1 2&lt;br /&gt;
 8 1&lt;br /&gt;
&amp;lt;code&amp;gt;camelotOUT.txt&amp;lt;/code&amp;gt;&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;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
dx = [-2, -2, -1, -1, 1, 1, 2, 2]&lt;br /&gt;
dy = [1, -1, -2, 2, -2, 2, -1, 1]&lt;br /&gt;
&lt;br /&gt;
def inmat(i, j, n, m):&lt;br /&gt;
    return 1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= m&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m, k, c1, c2, positions):&lt;br /&gt;
    if not (5 &amp;lt;= n &amp;lt;= 1000 and 5 &amp;lt;= m &amp;lt;= 1000):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= 1000):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    if not (1 &amp;lt;= c1 &amp;lt;= m and 1 &amp;lt;= c2 &amp;lt;= n):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    for x, y in positions:&lt;br /&gt;
        if not (1 &amp;lt;= x &amp;lt;= m and 1 &amp;lt;= y &amp;lt;= n):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def lee(ir, jr, n, m, b, q):&lt;br /&gt;
    b[ir][jr] = 1&lt;br /&gt;
    q.append((ir, jr))&lt;br /&gt;
    &lt;br /&gt;
    while q:&lt;br /&gt;
        x, y = q.popleft()&lt;br /&gt;
        for d in range(8):&lt;br /&gt;
            ii, jj = x + dx[d], y + dy[d]&lt;br /&gt;
            if inmat(ii, jj, n, m) and b[ii][jj] == 0:&lt;br /&gt;
                b[ii][jj] = b[x][y] + 1&lt;br /&gt;
                q.append((ii, jj))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;camelotIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;camelotOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        op = int(fin.readline().strip())&lt;br /&gt;
        n, m, k = map(int, fin.readline().strip().split())&lt;br /&gt;
        c1, c2 = map(int, fin.readline().strip().split())&lt;br /&gt;
        &lt;br /&gt;
        positions = [tuple(map(int, fin.readline().strip().split())) for _ in range(k)]&lt;br /&gt;
        &lt;br /&gt;
        restriction_error = check_restrictions(n, m, k, c1, c2, positions)&lt;br /&gt;
        if restriction_error:&lt;br /&gt;
            fout.write(restriction_error)&lt;br /&gt;
        else:&lt;br /&gt;
            a = [[0] * 1001 for _ in range(1001)]&lt;br /&gt;
            b = [[0] * 1001 for _ in range(1001)]&lt;br /&gt;
            q = deque()&lt;br /&gt;
            &lt;br /&gt;
            lee(c1, c2, n, m, b, q)&lt;br /&gt;
            &lt;br /&gt;
            mini = float(&amp;#039;inf&amp;#039;)&lt;br /&gt;
            maxi = 0&lt;br /&gt;
            &lt;br /&gt;
            for x, y in positions:&lt;br /&gt;
                if b[x][y] &amp;lt; mini:&lt;br /&gt;
                    mini = b[x][y]&lt;br /&gt;
                if b[x][y] &amp;gt; maxi:&lt;br /&gt;
                    maxi = b[x][y]&lt;br /&gt;
            &lt;br /&gt;
            if op == 1:&lt;br /&gt;
                fout.write(str(mini - 1))&lt;br /&gt;
            else:&lt;br /&gt;
                fout.write(str(maxi - 1))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
</feed>