目录
f[i][j]=(f[i-1][j]+f[i][j-1]);
描述
一个N×N的网格,你一开始在(1,1),即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N),即右下角有多少种方法。
但是这个问题太简单了,所以现在有M个格子上有障碍,即不能走到这M个格子上。(数据保证起始点和终止点无障碍物,并且起点到终点至少存在一条通路)
输入描述
输入文件第1行包含两个非负整数N,M,表示了网格的边长与障碍数。
接下来M行,每行两个不大于N的正整数x,y。表示坐标(x,y)上有障碍不能通过,且有1≤x,y≤n,且起点到终点一定可以走通,并请注意障碍坐标有可能相同。
输出描述
一个非负整数,到达(N,N)的路径数。
样例
样例输入
3 1 3 1
样例输出 1
5
递推关系式
f[i][j]=(f[i-1][j]+f[i][j-1]);
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int a[N][N];
int f[N][N];
int main(){
int n,m;
cin>>n>>m;
while(m--){
int x,y;
cin>>x>>y;
a[x][y]=1;
}
f[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(a[i][j]==0 && !(i==1 && j==1)){
f[i][j]=(f[i-1][j]+f[i][j-1]);
}
}
cout<<f[n][n];
return 0;
}