HDU-Pascal's Travels(記憶化搜索)

題目

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章