洛谷 P1176 路徑計數2
阿新 • • 發佈:2017-12-13
說明 輸出 names lac size for sam can 復制
P1176 路徑計數2
題目描述
一個N×N的網格,你一開始在(1, 1),即左上角。每次只能移動到下方相鄰的格子或者右方相鄰的格子,問到達(N, N),即右下角有多少種方法。
但是這個問題太簡單了,所以現在有M個格子上有障礙,即不能走到這M個格子上。
輸入輸出格式
輸入格式:
輸入文件第1行包含兩個非負整數N,M,表示了網格的邊長與障礙數。
接下來M行,每行兩個不大於N的正整數x, y。表示坐標(x, y)上有障礙不能通過,且有1≤x, y≤n,且x, y至少有一個大於1,並請註意障礙坐標有可能相同。
輸出格式:
輸出文件僅包含一個非負整數,為答案mod 100003後的結果。
輸入輸出樣例
輸入樣例#1: 復制3 1
3 1
輸出樣例#1: 復制
5
說明
對於20%的數據,有N≤3;
對於40%的數據,有N≤100;
對於40%的數據,有M=0;
對於100%的數據,有N≤1000,M≤100000。
思路:簡單的棋盤dp。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 100003 usingnamespace std; int n,m; int map[1010][1010]; int ans[1010][1010]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); map[x][y]=1; } ans[1][1]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)if(!map[i][j]){ if(i==1&&j==1) continue; if(i>1&&j>1&&!map[i-1][j]&&!map[i][j-1]) ans[i][j]=(ans[i][j]+ans[i-1][j]+ans[i][j-1])%mod; else if((i<=1||map[i-1][j])&&j>1&&!map[i][j-1]) ans[i][j]=(ans[i][j]+ans[i][j-1])%mod; else if((j<=1||map[i][j-1])&&i>1&&!map[i-1][j]) ans[i][j]=(ans[i][j]+ans[i-1][j])%mod; } cout<<ans[n][n]; }
洛谷 P1176 路徑計數2