題目
nxn遊戲板上裝有整數,每平方一個非負整數。目標是沿着板子的左上角到右下角的任何合法路徑行進。任何一個正方形中的整數表示距該位置必須多大的步幅。如果步長將提前離開遊戲板,則禁止沿該特定方向前進。所有步驟都必須在右側或底部。請注意,0是一個死角,會阻止進一步的進展。
考慮圖1所示的4 x 4板,其中實心圓圈標識起始位置,而虛線圓圈標識目標。圖2顯示了從起點到目標的三個路徑,每個路徑中不相關的數字都已刪除。
輸入格式
輸入包含1到30個板的數據,最後一行僅包含整數-1。電路板的數據從包含單個正整數n(4 <= n <= 34)的行開始,n是該電路板中的行數。隨後是n行數據。每行包含n個數字,0-9,中間沒有空格。
輸出格式
每個板的輸出由一行組成,包含一個整數,該整數是從左上角到右下角的路徑數。任何一塊板的路徑將少於2 ^ 63。
樣本輸入
4
2331
1213
1231
3110
4
3332
1213
1232
2120
5
11101
01111
11111
11101
11101
-1
樣本輸出
3
0
7
代碼
#include<bits/stdc++.h>
using namespace std;
int n,m,k,Max;
long long vis[110][110];
int Map[110][110];
int dir[4][2]={-1,0,1,0,0,-1,0,1};
long long dfs(int x,int y){
if(x==n-1&&y==n-1){ //到點
return 1;
}
if(vis[x][y]){
return vis[x][y];
}
if(x<0||y<0||x>=n||y>=n||Map[x][y]==0){ //如果爲0或者超出範圍
return 0;
}
vis[x][y]+=dfs(x+Map[x][y],y)+dfs(x,y+Map[x][y]); //兩個方向
return vis[x][y];
}
int main(){
while(scanf("%d",&n)!=EOF){
if(n==-1){
break;
}
memset(vis,0,sizeof(vis));
char s[50];
for(int i=0;i<n;i++){
scanf("%s",s);
for(int j=0;j<n;j++){
Map[i][j]=s[j]-'0';
}
}
printf("%lld\n",dfs(0,0));
}
return 0;
}