Cerinţa
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
Explicație
#include <bits/stdc++.h> 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]; }