# PBinfo #2041 – camelot – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Regele Arthur – Inimă de Leu, vrea să adune la castel toţi cavalerii Mesei Rotunde pentru a hotărî împreună soarta regatului. Dar cavalerii nu se află toţi în Camelot şi durează un timp până vor ajunge la castel din pădurea care înconjoară castelul. 

Harta pădurii are forma unei matrici, cu m linii şi n coloane. Pentru fiecare cavaler care nu este în Camelot se cunosc coordonatele x y, 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.

Cunoscând dimensiunile mxn ale matricei, coordonatele castelului şi cele ale cavalerilor, se cere să se determine:

1.	numărul minim de mutări după care va ajunge la castel unul dintre cavaleri
2.	numărul minim de mutări după care toţi cavalerii se vor afla la castel.



De exemplu, în imaginea de mai sus este reprezentată harta sub forma unei matrici de tip 8x8, iar castelul are coordonatele  4 5    (linia 4 şi coloana 5), primul cavaler se află iniţial în punctul de coordonate 1 2 iar cel de al doilea în punctul 8 1. Primul cavaler va ajunge la castel din minim 2 deplasări, iar al doilea după minim 4 mutări Pentru prima întrebare răspunsul este 2, iar pentru a doua întrebare răspunsul este 4.

Date de intrare
Fișierul de intrare camelot.in conține pe prima linie numărul p, pentru toate testele de intrare numărul p putând avea doar valoarea 1 sau valoarea 2.

Pe cea de a doua linie sunt scrise numerele naturale m n k,  separate prin câte un spaţiu, iar pe a treia linie se află coordonatele xc yc ale castelului. Pe următoarele k linii se află k perechi de numere întregi x[i] y[i] (1 ≤ i ≤ k), separate prin câte un spaţiu, reprezentând coordonatele cavalerilor.

Date de ieșire
Fișierul de ieșire camelot.out va conține pe prima linie:


pentru p=1, pe prima linie se va scrie numărul minim de mutări după care va ajunge unul din cavaleri
pentru p=2, pe prima linie se va scrie numărul minim de mutări după care vor ajunge toţi cavalerii

Restricții și precizări

5 ≤ m,n ≤ 1000
1 ≤ k ≤ 1000
1 ≤ x[i], xc ≤ m, 1 ≤ y[i], yc ≤ n, pentru orice 1 ≤ i ≤ k
Eventualele intersecţii ale drumurilor cavalerilor nu influenţează rezultatele
Pentru datele de test se garantează existenţa unei soluţii

Exemple:
camelot.in

1
8 8 2
4 5
1 2
8 1
camelot.out

2
camelot.in

2
8 8 2
4 5
1 2
8 1
camelot.out

4
Explicație
Vezi imaginea şi explicaţiile de mai sus

## Cod sursă C++

```cpp
#include<fstream>
#include<queue>
using namespace std;
//deplasarile dupa cele 8 directii
int dx[]= {-1,-1,-2,-2,+1,+1,+2,+2};
int dy[]= {-2,+2,-1,+1,-2,+2,-1,+1};
//adrese castel si cavaleri
struct loc
{
    int x,y;
};
loc castel;
loc cavaleri[1001];
queue<loc> Coada;
//harta
int A[1001][1001];
int p,m,n,k;
int r1,r2;
void citire()
{
    loc adresa;
    ifstream fin("camelot.in");
    fin>>p>>m>>n>>k;
    fin>>castel.x>>castel.y;
    for(int i=1; i<=k; i++)
    {
        fin>>cavaleri[i].x>>cavaleri[i].y;
    }
    fin.close();
}
void rezolva()
{
    loc p,adresa;
    int i,x,y;
    Coada.push(castel);
    A[castel.x][castel.y]=1;
    while(!Coada.empty())
    {
        p=Coada.front();
        Coada.pop();
        for(i=0; i<8; i++)
        {
            x=p.x+dx[i];
            y=p.y+dy[i];
            if(x>=1 && x<=m && y>=1 && y<=n)
                if(A[x][y]==0)
                {
                    adresa.x=x;
                    adresa.y=y;
                    Coada.push(adresa);
                    A[x][y]=1+A[p.x][p.y];
                }
        }
    }
    p=cavaleri[1];
    r1=r2=A[p.x][p.y];
    for(i=2;i<=k;i++)
    {
        if(r1>A[cavaleri[i].x][cavaleri[i].y])
            r1=A[cavaleri[i].x][cavaleri[i].y];
        if(r2<A[cavaleri[i].x][cavaleri[i].y])
            r2=A[cavaleri[i].x][cavaleri[i].y];
    }
    r1--;
    r2--;
}
void afisare()
{
    ofstream fout("camelot.out");
    if(p==1)
        fout<<r1;
    else
        fout<<r2;
    fout.close();
}
int main()
{
    citire();
    rezolva();
    afisare();
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2041)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2041/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2041/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
