Castelul Zânei Spiriduşilor este construit pe o suprafaţă dreptunghiulară având n*m
camere identice, de formă pătratică, dispuse câte m
pe direcţia Ox
şi câte n
pe direcţia Oy
ca în desenul de mai jos în care n=3
şi m=6
. Din fiecare cameră se poate intra în orice cameră învecinată, cameră care are un perete comun cu acesta. Fiecare cameră este identificată prin coordonatele sale, ca în figură.
În castel, trăiesc k
spiriduşi împreună cu Zâna lor. Fiind în curând aniversarea zilei de naştere a Zânei, fiecare spiriduş a pregătit câte un cadou pe care îl ascunde, nevăzut de ceilalţi, într-una din camerele castelului. Tradiţia acestei sărbătoriri, impune următoarele reguli:
- În căutarea cadourilor, Zâna porneşte din camera de coordonate
(1,1)
. Ea se deplasează prin camerele castelului cât timp în aceste camere nu se află niciun cadou. - Căutarea se încheie în momentul în care Zâna intră într-o cameră în care se află cel puţin un cadou. Zână va primi toate cadourile aflate în acestă cameră, restul cadourilor vor dispărea.
Cerinţă
Scrieţi un program care să citească din fişierul zana.in
numerele naturale n, m, k
şi cele k
coordonatele ale camerelor în care spiriduşii au ascuns cadourile, şi care să determine:
a) numărul n1
maxim de cadouri pe care le poate primi Zâna în urma respectării regulilor;
Exemplu
zana.in
3 5 11 1 5 1 5 1 3 1 3 1 4 1 4 1 4 2 4 2 4 2 5 3 2
zana.out
2 2
Explicație
Castelul are 3*5=15
camere. Coordonatele acestora sunt cele din figura 1
, iar cadourile sunt dispuse ca în figura următoare:
Zâna porneşte căutarea începând din camera de coordonate (1,1)
. Camera cu număr maxim de cadouri (3
) are coordonatele (1,4)
, dar zâna nu poate ajunge în acestă cameră, deoarece pentru a ajunge în acesta ea trebuie să treacă prin una din camerele de coordonate (1,3)
, (2,4)
, (2,5)
în care se află cadouri. Conform regulamentului, căutarea se va încheia în una din aceste camere. Astfel zâna poate parcurge camerele (1,1)
, (1,2)
, (1,3)
sau (1,1)
, (1,2)
, (2,2)
, (2,3)
, (2,4)
, etc pentru a ajunge într-una din cele n2=2
camere cu număr n1=2
maxim de cadouri.
#include <bits/stdc++.h> using namespace std; ifstream cin("zana.in"); ofstream cout("zana.out"); int a[101][101] , b[101][101] , n , m; void fill(int i , int j) { b[i][j]=1; a[i][j]=-1; if(a[i+1][j]==0 && i+1 <= n) fill(i+1 , j); if(a[i-1][j]==0 && i-1 >= 1) fill(i-1 , j); if(a[i][j+1]==0 && j+1 <= m) fill(i , j+1); if(a[i][j-1]==0 && j-1 >= 1) fill(i , j-1); } int main() { int k; cin >> n >> m >> k; for(int q = 1 ; q <= k ; ++q) { int x , y; cin >> x >> y; a[x][y]+=1; } fill(1 , 1); int max=0 , cnt=0; for(int i = 1 ; i <= n ; ++i) for(int j = 1 ; j <= m ; ++j) if(a[i][j]>0 && (b[i+1][j]==1 || b[i-1][j]==1 || b[i][j+1]==1 || b[i][j-1]==1)) { if(a[i][j]>max) max=a[i][j] , cnt=0; if(a[i][j]==max) cnt++; } cout << max << '\n' << cnt; return 0; }