题意:求从坐标(1,1)到(n,m)的路径数,有些地方是不能走的,输入有点麻烦而已,只能走右或下,所以动态转移方程就很简单了dp[i][j] = dp[i-1][j] + dp[i][j-1]
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1010;
char str[MAXN];
int n,m,G[MAXN][MAXN],dp[MAXN][MAXN];
int main(){
int t;
scanf("%d",&t);
while (t--){
scanf("%d%d%*c",&n,&m);
memset(G,1,sizeof(G));
memset(dp,0,sizeof(dp));
for (int i = 1; i <= n; i++){
int tmp;
scanf("%d",&tmp);
gets(str);
int len = strlen(str);
int cur = 0;
for (int j = 0; j <= len; j++)
if (isdigit(str[j]))
cur = cur * 10 + str[j] - '0';
else G[tmp][cur] = 0,cur = 0;
}
dp[1][1] = 1;
G[1][1] = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (G[i][j])
dp[i][j] = dp[i-1][j] + dp[i][j-1];
printf("%d\n",dp[n][m]);
if (t)
printf("\n");
}
return 0;
}