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
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 Cladire1:
#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;
}
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 #393 Cladire1
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #393 Cladire1 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!