Răspuns :
#include <iostream>
using namespace std;
int main(){
//elementele matricei a, a[i][j]
//vor avea o valoare egala cu numarul de moduri in care
//poti ajunge de la i,j la n,m
int n,m,i,j,indice,k,a[100][100];
cout<<"Introduceti dimensiunile:";
cin>>n>>m;
cout<<"Introduceti numarul de usi inchise";
cin>>k;
//o initializam cu -1 pe toata ca sa aratam ca nu
//stim cate cai sunt deocamdata
for(i=0;i<n;i++){
for(j=0;j<m;j++){
a[i][j]=-1;
}
}
//usile aflate pe ultima coloana si ultima linie
//decat intr-un singur sens: in jos pentru coloana, si in dreapta pentru ultima linie
//deci toate aceste elemente vor avea valoarea 1
for(i=0;i<n;i++){
a[i][m-1]=1;
}
for(j=0;j<m;j++){
a[n-1][j]=1;
}
//citim usile inchise
for(indice=0;indice<k;indice++){
cin>>i>>j;
//de la elementul i j nu se poate ajunge la n m pentru ca e inchisa
//deci ii dam valoarea 0
a[i-1][j-1]=0;
}
//de la fiecare usa poti ajunge la final folosindu-ne
//de suma modurilor la care poti ajunge de la usa din dreapta
//si de la usa de jos. Daca una dintre ele este blocata, atunci are valoarea 0
//deci reflecta intr-adevar ca nu exista moduri sa o iei pe acolo
for(i=n-2;i>=0;i--){
for(j=m-2;j>=0;j--){
//verificam actuala usa sa nu fie inchisa
if(a[i][j]!=0){
a[i][j]=a[i+1][j]+a[i][j+1];
}
}
}
//afisam toate posibilitatile din fiecare pozitie
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
//elementul 0,0 va arata exact cate moduri poti sa pornesti de la prima usa pana la ultima
//ignora faptul ca se numeste 0,0 in loc de 1,1 principiul e exact acelasi, numai ca va merge pana
//la usa n-1,n-1, distanta intre usi este tot de n-1
cout<<a[0][0]<<endl;
return 0;
}
using namespace std;
int main(){
//elementele matricei a, a[i][j]
//vor avea o valoare egala cu numarul de moduri in care
//poti ajunge de la i,j la n,m
int n,m,i,j,indice,k,a[100][100];
cout<<"Introduceti dimensiunile:";
cin>>n>>m;
cout<<"Introduceti numarul de usi inchise";
cin>>k;
//o initializam cu -1 pe toata ca sa aratam ca nu
//stim cate cai sunt deocamdata
for(i=0;i<n;i++){
for(j=0;j<m;j++){
a[i][j]=-1;
}
}
//usile aflate pe ultima coloana si ultima linie
//decat intr-un singur sens: in jos pentru coloana, si in dreapta pentru ultima linie
//deci toate aceste elemente vor avea valoarea 1
for(i=0;i<n;i++){
a[i][m-1]=1;
}
for(j=0;j<m;j++){
a[n-1][j]=1;
}
//citim usile inchise
for(indice=0;indice<k;indice++){
cin>>i>>j;
//de la elementul i j nu se poate ajunge la n m pentru ca e inchisa
//deci ii dam valoarea 0
a[i-1][j-1]=0;
}
//de la fiecare usa poti ajunge la final folosindu-ne
//de suma modurilor la care poti ajunge de la usa din dreapta
//si de la usa de jos. Daca una dintre ele este blocata, atunci are valoarea 0
//deci reflecta intr-adevar ca nu exista moduri sa o iei pe acolo
for(i=n-2;i>=0;i--){
for(j=m-2;j>=0;j--){
//verificam actuala usa sa nu fie inchisa
if(a[i][j]!=0){
a[i][j]=a[i+1][j]+a[i][j+1];
}
}
}
//afisam toate posibilitatile din fiecare pozitie
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
//elementul 0,0 va arata exact cate moduri poti sa pornesti de la prima usa pana la ultima
//ignora faptul ca se numeste 0,0 in loc de 1,1 principiul e exact acelasi, numai ca va merge pana
//la usa n-1,n-1, distanta intre usi este tot de n-1
cout<<a[0][0]<<endl;
return 0;
}
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Ne dorim ca informațiile furnizate să vă fi fost utile. Dacă aveți întrebări sau aveți nevoie de suport suplimentar, nu ezitați să ne contactați. Revenirea dumneavoastră ne bucură, iar pentru acces rapid, adăugați-ne la favorite!