1. 程式人生 > >走迷宮(深度優先搜尋)

走迷宮(深度優先搜尋)

給一個 n 行 m 列的 2 維的迷宮,'S'表示迷宮額起點,'T'表示迷宮的終點,'#'表示不能通過的點,'.' 表示可以通過的點。你需要從'S'出發走到'T',每次只能上下左右走動,並且只能進入能通過的點,每個點只能通過一次。現在要求你求出有多少種通過迷宮的的方案。

輸入格式

第一行輸入 nm(1n,m10) 表示迷宮大小

接下來輸入 n 行字串表示迷宮

輸出格式

輸入通過迷宮的方法數

樣例輸入1

2 3
S.#
..T

樣例輸出1

2

樣例輸入2

3 3
S..
.#.
..T

樣例輸出2

2

解題說明:

程式碼:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int ans=0;
char room[15][15];
int mark[15][15];
int cgx[5]={0,1,-1,0,0};
int cgy[5]={0,0,0,-1,1};
void dfs(int x,int y){
	if(room[x][y]==6){
		ans++;
		return;
	}
	mark[x][y]=1;
	for(int i=1;i<=4;i++){
		int xx=x+cgx[i];
		int yy=y+cgy[i];
	   if(!mark[xx][yy]&&room[xx][yy]!=0)dfs(xx,yy);
	}
	mark[x][y]=0;
}
int main(){
	int n,m;cin>>n>>m;
	char ip1;int op2;
	int beg,end;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>ip1;
			if(ip1=='S'){
				beg=i;end=j;
				op2=5;
			}
			if(ip1=='T')op2=6;
			if(ip1=='.')op2=1;
			if(ip1=='#')op2=0;
		    room[i][j]=op2;
		}
	}
	dfs(beg,end);
	cout<<ans<<endl;
	return 0;
}