CSU 国防科大决赛 D题 找路径 (水题-DP)
题意:二维数组,从(1,1)到(n,m),先考虑木有障碍的情况,推公式:dp[i][j] = (dp[i-1][j] + dp[i][j-1]),前提的dp出口是dp[1][1] = 1。
接着,就是考虑障碍的情况,先设预处理一遇到障碍,dp[xi][yi]=-1,在遍历的时候dp[xi][yi]修改0,(1,1)单独考虑。
#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
#define N 1010
#define M 1000000007
long long dp[N][N],xi,yi;
int main(){
int t,n,m,i,j,k,flag;
scanf("%d",&t);
while(t--){
scanf("%d %d %d",&n,&m,&k);
memset(dp,0,sizeof(dp));
// for(i=1;i<=n;i++){
// dp[i][1] = 1;
// }
// for(i=1;i<=m;i++){
// dp[1][i] = 1;
// }
dp[1][1] = 1;
while(k--){
scanf("%d %d",&xi,&yi);
dp[xi][yi] = -1;
}
flag = 1;
if(dp[1][1]==-1){
flag = 0;
dp[n][m] = 0;
}
for(i=1;flag && i<=n;i++){
for(j=1;j<=m;j++){
if(i==1&&j==1){
continue;
}
if(dp[i][j]==-1){
dp[i][j] = 0;
continue;
}
dp[i][j] = (dp[i-1][j] + dp[i][j-1])%M;
}
}
printf("%lld\n",dp[n][m]%M);
}
return 0;
}