题目大意:
给出障碍的位置,问最短路径可以有几条。
思路:
最短路径的长度 = w + n - 2 即上面的长度加左边的长度
dp[i][j]表示到坐标(i,j)可以有几条路径。
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
如果是障碍 dp[i][j] = 0;
最后答案为 dp[w][n]
代码:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
#include <sstream>
#include <cmath>
#include <cstdlib>
int w,n;
int grid[1000][1000];
int dp[1000][1000];
int main() {
char s[1000];
stringstream s1;
int temp;
int x,t;
int kases;
scanf("%d",&kases);
while(kases--) {
scanf("%d %d",&w,&n);
memset(grid,0,sizeof(grid));//忘记写 WA了两次。。
for(int i = 0; i < w; i++) {
scanf("%d",&x);
// getchar();
gets(s);
//cout << s << endl;
temp = strlen(s);
// cout << temp << endl;
t = 0;
for(int j = 0 ; j <= temp; j++) {
if(!isdigit(s[j])){
t = t * 10 + atoi(&s[j]);
}
else {
grid[x][t] = 1;
t = 0;
}
}
// grid[x][t] = 1;
}
memset(dp,0,sizeof(dp));
dp[0][1] = 1;
for(int i = 1; i <=w; i++) {
for(int j = 1; j <= n; j++) {
if(grid[i][j] == 1)
dp[i][j] = 0;
else
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
printf("%d\n",dp[w][n]);
if(kases)
printf("\n");
}
return 0;
}