设始点为S,终点为D,始点的下一个搜索点为N
那么N点的位置有很多种可能(视能量而定,也就是下面的if语句里
面的条件,设N(i),那么从S到D的路径数就等于N(i)到D的各自的路径数之和,
以此类推求N(i)的下一个点(也可能有多种),递归搜索搞定
*/
#include<iostream>
using namespace std;
int map[105][105]; //记录矩阵的值
int ans[105][105]; //记录当前点到终点的路径数
int N,M;
int DFS(int x,int y){
int sum=0;
if(x==N && y==M) //一点直达终点当然只有一条路径
return 1;
if(ans[x][y]>=0) //已经搜过的,直接返回当前点到终点的路径数
return ans[x][y];
for(int i=0;i<=map[x][y];i++) //遍历下一个可能到达的点
for(int j=0;j<=map[x][y];j++)// 注意i和j是从0开始
{
if((i+j)<=map[x][y] && (i+x)<=N && (j+y)<=M && (i+j)!=0)
{
sum+=DFS(i+x,j+y);
sum%=10000;
}
}
ans[x][y]=sum;
return sum;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
memset(map,0,sizeof(map));
memset(ans,-1,sizeof(ans));
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
scanf("%d",&map[i][j]);
printf("%d\n",DFS(1,1));
}
// system("pause");
return 0;
}