1. 程式人生 > >洛谷 P1176 路徑計數2

洛谷 P1176 路徑計數2

說明 輸出 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
using
namespace 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