ACM水题-迷宫(AC,DFS)

迷宫

Time Limit:1000MS  Memory Limit:65536K
Total Submit:127 Accepted:54

Description

给出一个n*m的字符矩阵表示的地图,其中只包含4种字符'B' 'E' '.' 'X'。 'B'表示初始位置的格子,'E'表示终点位置的格子,'.'表示可以走的格子,'X'表示障碍物(即不可走的格子),请问是否存在一条路从初始位置走到终点位置。(注:每一步只能走到相邻的4个格子中的一个,不能走到矩阵之外,数据保证有且只有一个'B',有且只有一个'E')

Input

第一行有两个正整数n,m。(n,m <= 100)
下面为一个n*m的字符矩阵,即n行长度为m字符串每行字符之间没有空格

Output

输出只有1行。
若存在这样的路径则输出”Yes”,否则输出”No”。

Sample Input

4 4
BX.E
.X.X
.X.X
...X

Sample Output

Yes

Source

 

/*
不知道是不是递归的原因,速度慢了很多,46MS
*/

#include<stdio.h>

char chMap[104][104] ; 
const int nDir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}} ;   
int m = 0 ;
int n = 0 ;
int bX = 0 ;		
int bY = 0 ;		

int DFS(int x,int y) ;

int main(void)
{	
	int i = 0 ;
	int j = 0 ;
	
	scanf("%d%d",&n,&m) ;
	
	getchar() ;
	for(i = 0 ; i < n ; ++i)
	{
		for(j = 0 ; j < m ; ++j)
		{
			scanf("%c",&chMap[i][j]) ;
			if('B' == chMap[i][j])
			{
				bX = i ;
				bY = j ;
			}
		}
		getchar() ;
	}
	
	if(1 == DFS(bX,bY))
	{
		puts("Yes") ;
	}
	else
	{
		puts("No") ;
	}
	
	return 0 ;
}

int DFS(int x,int y)
{
	int i = 0 ;
	int j = 0 ;
	
	if(x < 0 || y < 0 || x >= n || y >= m)
	{
		return 0 ;
	}
	
	for(i = 0 ; i < 4 ; ++i)					
	{
		if('E' == chMap[x+nDir[i][0]][y+nDir[i][1]])	
		{
			return 1 ;
		}
		else if('.' == chMap[x+nDir[i][0]][y+nDir[i][1]])		
		{
			chMap[x+nDir[i][0]][y+nDir[i][1]] = 'X' ;		
			
			if(1 == DFS(x+nDir[i][0],y+nDir[i][1]))			
			{
				return 1 ;
			}
			chMap[x+nDir[i][0]][y+nDir[i][1]] = '.' ;	
		}
	}	
	return 0 ;
}


 

 

你可能感兴趣的:(c,input,output)