题目的意思就是问从左上的点走到右下的点有几条不同的路,某些点不能走..
dp思路很简单.走到这个点的数量,等于走到它上面那个点的数量 ,和左边那个点的数量的和.
就是读入麻烦.因为数字间不只一个空格..
AC代码:
#include<stdio.h>
#include<string.h>
const int N = 1000;
int g[N][N];
int f[N][N];
int r,c;
char temp[N];
int dp (int r ,int c) {
if( r < 1 || c < 1)
return 0;
if (g[r][c] == 1) {
f[r][c] = 0;
// dp(r - 1 , c);
// dp(r , c - 1);
return 0;
}
if(f[r][c] != -1)
return f[r][c];
f[r][c] = dp(r - 1 , c) + dp (r , c - 1);
return f[r][c];
}
int main () {
int t;
int a,b;
char ch;
scanf("%d",&t);
while (t--) {
memset(g , 0 ,sizeof(g));
memset(f , -1 ,sizeof(f));
f[1][1] = 1;
scanf("%d%d",&r,&c);
for(int i = 1 ; i <= r ;i++) {
bool flag = true;
scanf("%d",&a);
while(1) {
b = 0;
if(flag)
while((ch = getchar()) == ' ');
else
break;
if(ch == '\n')
break;
b += (ch - 48);
while(ch = getchar()) {
if(ch <= '9' && ch >= '0') {
b = b * 10 + (ch - 48);
}
else if (ch == ' '){
break;
}
else if (ch == '\n'){
flag = false;
break;
}
}
g[a][b] = 1;
}
}
dp(r,c);
// for (int i = 1 ; i <= r;i++) {
// for (int j = 1 ; j <= c ; j++) {
// printf("%d ",f[i][j]);
// }
// printf("\n");
// }
printf("%d\n",f[r][c]);
if(t)
printf("\n");
}
}