Parcul oraşului a fost neglijat mult timp, astfel că acum toate aleile sunt distruse. Prin urmare, anul acesta Primăria şi-a propus să facă reamenajări. Parcul are forma unui pătrat cu latura de n
metri și este înconjurat de un gard care are exact două porți. Proiectanții de la Primărie au realizat o hartă a parcului și au trasat pe hartă un caroiaj care împarte parcul în nxn
zone pătrate cu latura de 1
metru. Astfel harta parcului are aspectul unei matrice pătratice cu n
linii și n
coloane. Liniile și respectiv coloanele sunt numerotate de la 1
la n
. Elementele matricei corespund zonelor pătrate de latură 1
metru. O astfel de zonă poate să conțină un copac sau este liberă. Edilii orașului doresc să paveze cu un număr minim de dale pătrate cu latura de 1
metru zonele libere (fără copaci) ale parcului, astfel încât să se obțină o alee continuă de la o poartă la alta.
Cerința
Scrieți un program care să determine numărul minim de dale necesare pentru construirea unei alei continue de la o poartă la cealaltă.
Date de intrare
Fișierul de intrare alee.in
conține pe prima linie două valori naturale n
și m
separate printr-un spațiu, reprezentând dimensiunea parcului, respectiv numărul de copaci care se găsesc în parc. Fiecare dintre următoarele m
linii conține câte două numere naturale x
și y
separate printr-un spațiu, reprezentând pozițiile copacilor în parc (x
reprezintă linia, iar y
reprezintă coloana zonei în care se află copacul). Ultima linie a fișierului conține patru numere naturale x1 y1 x2 y2
, separate prin câte un spațiu, reprezentând pozițiile celor două porți (x1
, y1
reprezintă linia și respectiv coloana zonei ce conține prima poartă, iar x2
, y2
reprezintă linia și respectiv coloana zonei ce conține cea de a doua poartă).
Date de ieșire
Fișierul de ieșire alee.out
va conţine o singură linie pe care va fi scris un număr natural care reprezintă numărul minim de dale necesare pentru construirea aleii.
Restricții și precizări
1 ≤ n ≤ 175
1 ≤ m < n*n
- Aleea este continuă dacă oricare două plăci consecutive au o latură comună.
- Aleea începe cu zona unde se găsește prima poartă și se termină cu zona unde se găsește cea de a doua poartă.
- Pozițiile porților sunt distincte şi corespund unor zone libere.
- Pentru datele de test există întotdeauna soluție.
Exemplu
alee.in
8 6 2 7 3 3 4 6 5 4 7 3 7 5 1 1 8 8
alee.out
15
Explicație
O modalitate de a construi aleea cu număr minim de dale este:
OOO-----
--OO--x-
--xO----
---OOx--
---xO---
----OO--
--x-xOO-
------OO
(cu X
am marcat copacii, cu -
zonele libere, iar cu O
dalele aleii).
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema alee:
#include <queue>
#include <fstream>
#define infinit 2000000
using namespace std;
char a[205][205];
int b[205][205];
int n, xs, ys, xf, yf;
queue < pair<int, int> > q;
void Lee()
{
int i, j, x, y, k;
int dx[] = {1,0,-1, 0};
int dy[] = {0,1, 0,-1};
q.push(make_pair(xs, ys));
b[xs][ys] = 1;
while (!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for (k = 0; k < 4; k++)
{
x = i + dx[k];
y = j + dy[k];
if (a[x][y] != 'x' && b[x][y] > b[i][j] + 1)
{
b[x][y] = b[i][j] + 1;
q.push(make_pair(x, y));
}
}
}
}
void Bordare()
{
int i;
for (i = 0; i <= n + 1; i++)
a[0][i] = a[n+1][i] = a[i][0] = a[i][n+1] = 'x';
}
void Citire()
{
int i, j, y, x, m;
ifstream fin("alee.in");
fin >> n >> m;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
a[i][j] = '.';
b[i][j] = infinit;
}
for (i = 1; i <= m; i++)
{
fin >> x >> y;
a[x][y] = 'x';
}
fin >> xs >> ys >> xf >> yf;
fin.close();
}
void Afisare()
{
ofstream fout("alee.out");
fout << b[xf][yf] << "\n";
fout.close();
}
int main()
{
Citire();
Bordare();
Lee();
Afisare();
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2167 alee
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2167 alee de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!