路径计数2
题目描述
一个 N × N N \times N N×N的网格,你一开始在 ( 1 , 1 ) (1,1) (1,1),即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子,问到达 ( N , N ) (N,N) (N,N),即右下角有多少种方法。
但是这个问题太简单了,所以现在有 M M M个格子上有障碍,即不能走到这 M M M个格子上。
输入格式
输入文件第 1 1 1行包含两个非负整数 N , M N,M N,M,表示了网格的边长与障碍数。
接下来 M M M行,每行两个不大于 N N N的正整数 x , y x, y x,y。表示坐标 ( x , y ) (x, y) (x,y)上有障碍不能通过,且有 1 ≤ x , y ≤ n 1≤x, y≤n 1≤x,y≤n,且 x , y x, y x,y至少有一个大于 1 1 1,并请注意障碍坐标有可能相同。
输出格式
一个非负整数,为答案$ \bmod 100003$后的结果。
样例 #1
样例输入 #1
3 1
3 1
样例输出 #1
5
提示
对于 20 % 20\% 20%的数据,有 N ≤ 3 N≤3 N≤3;
对于 40 % 40\% 40%的数据,有 N ≤ 100 N≤100 N≤100;
对于 40 % 40\% 40%的数据,有 M = 0 M=0 M=0;
对于 100 % 100\% 100%的数据,有 N ≤ 1000 , M ≤ 100000 N≤1000,M≤100000 N≤1000,M≤100000。
需要注意的地方,对计算出来的结果要取余计算,不然会溢出,导致结果错误。
通过题意可得
首先把a[1][1]=1,利用数组b来标记障碍物的位置,一旦遍历到障碍物的位置,就把这个位置对应数组a的位置置0,表示这点不可达。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[2000][2000] ,b[2000][2000];
int main()
{
cin>>n>>m;
int j,k;
for(int i=1;i<=m;++i)
{
cin>>j>>k;
b[j][k]=1;
}
a[1][1]=1;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(i==1&&j==1) continue;
if(b[i][j]!=1){
a[i][j]=a[i-1][j]+a[i][j-1];
}else if(b[i][j]==1){
a[i][j]=0;
}
a[i][j]=a[i][j]%100003;
}
}
cout<<a[n][n]<<endl;
return 0;
}