路径计数2

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

路径计数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 1x,yn 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 N3

对于 40 % 40\% 40%的数据有 N ≤ 100 N≤100 N100

对于 40 % 40\% 40%的数据有 M = 0 M=0 M=0

对于 100 % 100\% 100%的数据有 N ≤ 1000 , M ≤ 100000 N≤1000,M≤100000 N1000,M100000

需要注意的地方对计算出来的结果要取余计算不然会溢出导致结果错误。

通过题意可得
在这里插入图片描述首先把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;
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6