Se consideră o clădire de formă dreptunghiulară formată din n*m
camere, dispuse pe n
linii și m
coloane. Unele camere sunt închise, accesul în ele fiind imposibil. Intrarea în clădire este în camera de coordonate (1,1)
, iar ieșirea în camera de coordonate (n,m)
. Din orice cameră (i,j)
se poate ajunge numai în camerele (i+1,j)
sau (i,j+1)
, dacă aceasta nu este închisă.
Determinați în câte moduri se poate ajunge din camera (1,1)
în camera (n,m)
. Deoarece numărul de posibilități poate fi foarte mare, se cere doar restul acestui număr la împărțirea cu 9901
.
Date de intrare
Fişierul de intrare cladire1.in
conţine pe prima linie numerele n m
. Linia 2
conține k
, numărul de camere închise. Următoarele k
linii conțin câte 2
numere i j
, reprezentând coordonatele (linie, coloană) camerelor închise.
Date de ieşire
Fişierul de ieşire cladire1.out
va conţine pe prima linie numărul P
, reprezentând în câte moduri se poate ajunge din camera (1,1)
în camera (n,m)
, număr afișat modulo 9901
.
Restricţii şi precizări
1 ≤ n , m ≤ 1000
1 ≤ k ≤ 1000
1 ≤ i ≤ n
,1 ≤ j ≤ m
- camera de intrare și cea de ieșire nu sunt închise
Exemplu
cladire1.in
3 3 2 1 2 3 1
cladire1.out
2
#include <iostream> #include <fstream> #include <algorithm> #include <cassert> using namespace std; #define NN 1005 ifstream fin("cladire1.in"); ofstream fout("cladire1.out"); int n, m, a[NN][NN], s[NN][NN]; int main(){ assert(fin >> n >> m); int k, j,i; assert(fin >> k); for(int p=1 ; p<=k ; p++){ assert(fin >> i >> j); if(a[i][j]){ cout << i << " " <<j<< " se repetă la linia " << p << endl; exit(0); } a[i][j] = 1; } s[1][1]=1; for(int i=2;i<=n;++i) if(a[i-1][1] == 0) s[i][1] = s[i-1][1]; for(int j=2 ; j<=m ; ++j) if(a[1][j-1] == 0) s[1][j] = s[1][j-1]; for(int i=2 ; i<=n ; ++i) for(int j=2 ; j<=m ; ++j) { if(a[i-1][j] == 0) s[i][j] += s[i-1][j]; if(a[i][j-1] == 0) s[i][j] += s[i][j-1]; s[i][j] %= 9901; } fout << s[n][m]; return 0; }
#include <fstream> using namespace std; ifstream cin("cladire1.in"); ofstream cout("cladire1.out"); int n , m , k , a[1001][1001] , x , y; int main() { cin >> n >> m >> k; for(int i = 1 ; i <= k ; i++) { cin >> x >> y; a[x][y] = -1; } for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= m ; j++) if(i == 1 && j == 1) a[i][j] = 1; else if(a[i][j] != -1) a[i][j] = (a[i][j] + max(a[i - 1][j] , 0) + max(a[i][j - 1] , 0)) % 9901; cout << a[n][m]; }