题目链接:HDOJ 1978
代码:
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
#define M(a) memset(a,0,sizeof(a))
#define Max(a,b) ((a>b)?a:b)
#define debug 0
const int maxn = 100 + 5;
int data[maxn][maxn], vis[maxn][maxn];
int n, m;
bool judge(int x, int y){
if (x >= 1 && x <= n&&y >= 1 && y <= m)
return true;
return false;
}
int dfs(int x, int y){
if (vis[x][y] >= 0) //记忆化搜索
{
return vis[x][y];
}
if (x == n&&y == m)
{
return 1;
}
vis[x][y] = 0; //归0
for (int i = 0; i <= data[x][y]; i++)
{
for (int j = 0; i + j <= data[x][y]; j++)
if (judge(x + i, y + j)) //判断位置是个hi否合法
{
vis[x][y] += dfs(x + i, y + j);
}
}
return vis[x][y] %= 10000;
}
int main(){
#if debug
freopen("in.txt", "r", stdin);
#endif//debug
int T;
while (~scanf("%d", &T))
{
while (T--)
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
scanf("%d", &data[i][j]);
// printf("%d ",data[i][j]);
vis[i][j] = -1; //初始化 -1
}
printf("%d\n", dfs(1, 1));
}
}
return 0;
}