搞了点搜索,IDA*那个启发函数太难找了,先放一放,来搞DP,至于DP的题目是根据http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.html这个地方的内容来的,很全面……
这一题还比较好搞……处理当前点,看当前点可达哪一些点……
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 4 const int mod = 10000; 5 int map[105][105]; 6 int dp[105][105]; 7 8 int main() 9 { 10 int n,m; 11 int cas; 12 13 scanf("%d",&cas); 14 while(cas --) 15 { 16 scanf("%d%d",&n,&m); 17 18 for(int i = 1;i <= n;i ++) 19 { 20 for(int j = 1;j <= m;j ++) 21 { 22 scanf("%d",&map[i][j]); 23 } 24 } 25 26 memset(dp,0,sizeof(dp)); 27 dp[1][1] = 1; 28 for(int i = 1;i <= n;i ++) 29 { 30 for(int j = 1;j <= m;j ++) 31 { 32 //if(i == 1 && j == 1) continue; 33 for(int k = i;k <= n && k <= i + map[i][j];k ++) 34 { 35 for(int t = j;t <= m && t <= j + map[i][j];t ++) 36 { 37 if(k == i && t == j) continue; 38 if(k - i + t - j <= map[i][j]) 39 { 40 dp[k][t] += dp[i][j]; 41 dp[k][t] %= mod; 42 } 43 } 44 } 45 } 46 } 47 48 printf("%d\n",dp[n][m] % mod); 49 } 50 51 return 0; 52 }