题意:中文题。。。
记忆化搜索即可,对于点(i, j), dp[i][j] += dp[k][l]; ( 点(k, l) 可到达 ) .不过忘了剪枝。。TLE了两次。。
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int maxn = 111; const int MOD = 10000; int n, m, g[maxn][maxn], dp[maxn][maxn]; int dfs(int x, int y) { if(dp[x][y]) return dp[x][y] % MOD; //对搜索范围剪枝 int up = min(n, x+g[x][y]); int down = min(m, y+g[x][y]); for(int i=x; i<=up; i++) for(int j=y; j<=down; j++) { if(i == x && j == y) continue; if(i - x + j - y <= g[x][y]) //曼哈顿距离不超过能量值 { dp[x][y] += dfs(i, j); dp[x][y] %= MOD; } } return dp[x][y] % MOD; } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); memset(dp, 0, sizeof(dp)); dp[n][m] = 1; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d", &g[i][j]); int ans = dfs(1, 1); printf("%d\n", ans); } return 0; }