题意是给定一个矩阵,其中一些节点不能走,求最短路径数,可知最短路径为左上角到右下角的曼哈顿距离,所以每个点只能向下或向右走,判断其上节点和左节点是否可行即可。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool m[1000][1000];
int dp[1000][1000];
int main()
{
int T;
cin>>T;
while(T--){
memset(m,true,sizeof(m));
memset(dp,0,sizeof(dp));
for(int i=1;i<1000;i++) m[0][i]=m[i][0]=false;
int w,n,r;
cin>>w>>n;
getchar();
for(int i=1;i<=w;i++){
cin>>r;
char t;
int num=0;
while((t=getchar())){
if(t==' ') {m[i][num]=false;num=0;}
else if(t=='\n') {m[i][num]=false;break;}
else num=num*10+t-'0';
}
}
dp[1][1]=1;
for(int i=1;i<=w;i++)
for(int j=1;j<=n;j++){
if(m[i][j-1]) dp[i][j]+=dp[i][j-1];
if(m[i-1][j]) dp[i][j]+=dp[i-1][j];
}
cout<<dp[w][n]<<endl;
if(T) cout<<endl;
}
return 0;
}