標籤:des style blog http color java os strong
How many ways
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2762 Accepted Submission(s): 1630
Problem Description這是一個簡單的生存遊戲,你控制一個機器人從一個棋盤的起始點(1,1)走到棋盤的終點(n,m)。遊戲的規則描述如下:
1.機器人一開始在棋盤的起始點並有起始點所標有的能量。
2.機器人只能向右或者向下走,並且每走一步消耗一單位能量。
3.機器人不能在原地停留。
4.當機器人選擇了一條可行路徑後,當他走到這條路徑的終點時,他將只有終點所標記的能量。
如,機器人一開始在(1,1)點,並擁有4單位能量,藍色方塊表示他所能到達的點,如果他在這次直接選取中選擇的終點是(2,4)
點,當他到達(2,4)點時將擁有1單位的能量,並開始下一次直接選取,直到到達(6,6)點。
我們的問題是機器人有多少種方式從起點走到終點。這可能是一個很大的數,輸出的結果對10000模數。
Input第一行輸入一個整數T,表示資料的組數。
對於每一組資料第一行輸入兩個整數n,m(1 <= n,m <= 100)。表示棋盤的大小。接下來輸入n行,每行m個整數e(0 <= e < 20)。
Output對於每一組資料輸出方式總數對10000模數的結果.
Sample Input16 64 5 6 6 4 32 2 3 1 7 21 1 4 6 2 75 8 4 3 9 57 6 6 2 1 53 1 1 3 7 2
Sample Output3948
1 #include<stdio.h> 2 #include<string.h> 3 int n,m; 4 int map[110][110]; 5 int dp[110][110]; 6 int dfs(int x,int y) 7 { 8 int sum=0,i,j; 9 if(x==n&&y==m)10 return 1;11 if(dp[x][y]>=0)12 return dp[x][y];13 for(i=0; i<=map[x][y]; i++)14 for(j=0; j<=map[x][y]; j++)15 {16 if((i+j)<=map[x][y]&&i+x<=n&&j+y<=m&&(i+j)!=0)17 {18 sum+=dfs(i+x,j+y);19 sum%=10000;20 }21 }22 dp[x][y]=sum;23 return dp[x][y];24 }25 int main()26 {27 int t,i,j;28 scanf("%d",&t);29 while(t--)30 {31 scanf("%d%d",&n,&m);32 for(i=1; i<=n; i++)33 for(j=1; j<=m; j++)34 scanf("%d",&map[i][j]);35 memset(dp,-1,sizeof(dp));36 printf("%d\n",dfs(1,1));37 }38 return 0;39 }View Code