1. 程式人生 > >【ACM】CODE[VS] 1215 (DFS)

【ACM】CODE[VS] 1215 (DFS)

題目描述 Description

在N*N的迷宮內,“#”為牆,“.”為路,“s”為起點,“e”為終點,一共4個方向可以走。從左上角((0,0)“s”)位置處走到右下角((n-1,n-1)“e”)位置處,可以走通則輸出YES,不可以走則輸出NO。

輸入描述 Input Description

輸入的第一行為一個整數m,表示迷宮的數量。 
其後每個迷宮資料的第一行為一個整數n(n≤16),表示迷宮的邊長,接下來的n行每行n個字元,字元之間沒有空格分隔。

輸出描述 Output Description

輸出有m行,每行對應的迷宮能走,則輸出YES,否則輸出NO。

樣例輸入 Sample Input

1 
7 
s...##. 
.#..... 
....... 
..#.... 
..#...# 
###...# 
......e

樣例輸出 Sample Output

YES

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 20;
int vis[maxn][maxn],n,flag;
char map[maxn][maxn];
int xx[5]={0,-1,1,0,0};
int yy[5]={0,0,0,-1,1};
void dfs(int x,int y)
{
	int i;
	vis[x][y]=1;
	if(map[x][y]=='e')	
	{
		flag=1;
		return ;
	}
	for(i=1;i<=4;i++)
	{
		if(x+xx[i]>=0 && x+xx[i]<n && y+yy[i]>=0 && y+yy[i]<n && map[x+xx[i]][y+yy[i]]!='#' && vis[x+xx[i]][y+yy[i]]==0)
		{
				dfs(x+xx[i],y+yy[i]);
		}
		/*把兩個if合併,時間更少 
		if(x+xx[i]>=0 && x+xx[i]<n && y+yy[i]>=0 && y+yy[i]<n )
		{
			if( map[x+xx[i]][y+yy[i]]!='#' && vis[x+xx[i]][y+yy[i]]==0)
				dfs(x+xx[i],y+yy[i]);
		}*/
	}
}
int main ()
{
	int T,i,j;
	cin>>T;
	while(T--)
	{
		cin>>n;
		memset(vis,0,sizeof(vis));
		memset(map,0,sizeof(map));
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				cin>>map[i][j];
		flag=0;
		dfs(0,0);
		if(flag)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}