How many ways
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2957 Accepted Submission(s): 1733
1.機器人一開始在棋盤的起始點並有起始點所標有的能量。
2.機器人只能向右或者向下走,並且每走一步消耗一單位能量。
3.機器人不能在原地停留。
4.當機器人選擇了一條可行路徑後,當他走到這條路徑的終點時,他將只有終點所標記的能量。
如上圖,機器人一開始在(1,1)點,並擁有4單位能量,藍色方塊表示他所能到達的點,如果他在這次路徑選擇中選擇的終點是(2,4)
點,當他到達(2,4)點時將擁有1單位的能量,並開始下一次路徑選擇,直到到達(6,6)點。
我們的問題是機器人有多少種方式從起點走到終點。這可能是一個很大的數,輸出的結果對10000取模。
對於每一組數據第一行輸入兩個整數n,m(1 <= n,m <= 100)。表示棋盤的大小。接下來輸入n行,每行m個整數e(0 <= e < 20)。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int i,j,t,m,n,matrix[105][105],dp[105][105],x,y;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
memset(matrix,0,sizeof(matrix));
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&matrix[i][j]);
dp[1][1]=1;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
for(x=i;x>=i-20&&x>=0;x--)
for(y=j;y>=i-x+j-20&&y>=0;y--)
{
if(x==i&&y==j)
continue;
if(matrix[x][y]>=(i-x+j-y))
dp[i][j]+=dp[x][y]%10000;
}
printf("%d\n",dp[m][n]%10000);
}
return 0;
}