1 /*记忆化dfs+dp
2 dp[i][j]代表达到这个点的所有路的条数,那么所有到达终点的路的总数就是这dp[1][1]加上所有他所能到达的点的
3 所有路的总数
4 */
5
6 #include<stdio.h>
7 #include<string.h>
8 #include<algorithm>
9 using namespace std;
10 const int maxn=110;
11 int map[maxn][maxn],vis[maxn][maxn];
12 int dp[maxn][maxn];
13 int n,m;
14 int ok(int x,int y)
15 {
16 if(x>=1 && x<=n && y>=1 && y<=m) return 1;
17 return 0;
18 }
19 void init()
20 {
21 memset(dp,0,sizeof(dp));
22 memset(vis,0,sizeof(vis));
23 }
24 int dfs(int x,int y)
25 {
26 if(dp[x][y]) return dp[x][y];
27 if(x==n && y==m) return dp[x][y]=1;
28 int i,j;
29 int num=map[x][y];
30 for(i=0;i<=num;i++)
31 for(j=0;j<=num-i;j++)
32 {
33 int nx=x+i;
34 int ny=y+j;
35 if(ok(nx,ny) && !vis[nx][ny])
36 {
37 vis[nx][ny]=1;
38 dp[x][y]=(dp[x][y]+dfs(nx,ny))%10000;
39 vis[nx][ny]=0;
40 }
41 }
42 return dp[x][y]%10000;
43 }
44 int main()
45 {
46 int i,j;
47 int t;
48 scanf("%d",&t);
49 while(t--)
50 {
51 scanf("%d%d",&n,&m);
52 for(i=1;i<=n;i++)
53 for(j=1;j<=m;j++)
54 scanf("%d",&map[i][j]);
55 init();
56 vis[1][1]=1;
57 int sum=dfs(1,1);
58 printf("%d\n",sum);
59 }
60 return 0;
61 }