noi寒假刷题之旅_ 2.5基本算法之搜索(36题)

»2.5基本算法之搜索(36题)

1159:Maze

#include<iostream>
#include<cstring>
#define MAX 22
/*
用dfs会出现先到达终点,但是钥匙没找完的情况 
*/
using namespace std;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,M;
char t[MAX][MAX];
int  vis[MAX][MAX];
struct Pos 
{
	int x,y;
} s,m[5];
int key[5],r[5],locx[5],locy[5],flag=0;
bool check() 
{
	for(int i=0; i<5; i++)
		if(key[i]!=r[i])
			return 1;
	return 0;
}
void DFS(int posi,int posj)
{
	if(t[posi][posj]=='G') {	flag=1;return;	}
	if(('A'<=t[posi][posj]&&t[posi][posj]<='E')||t[posi][posj]=='X'||posi<=0||posi>M||posj<=0||posj>n){ return; }
	if('a'<=t[posi][posj]&&t[posi][posj]<='e')	
	{	
		key[t[posi][posj]-'a']--;
		if(!key[t[posi][posj]-'a']) t[locx[t[posi][posj]-'a']][locy[t[posi][posj]-'a']]='.';
		t[posi][posj]='.';
//		if(!key[t[posi][posj]-'a']) t[m[t[posi][posj]-'a'].x][m[t[posi][posj]-'a'].y]='.';
	}
	for(int i=0;i<4;++i)
	{
		if(vis[dx[i]+posi][dy[i]+posj]) continue; 
		else vis[dx[i]+posi][dy[i]+posj]=1;
		DFS(dx[i]+posi,dy[i]+posj);
		if(flag) return;
	}
}
void inti()
{
	memset(t,'X',sizeof(t));
	memset(vis,0,sizeof(vis));
	memset(key,0,sizeof(key));
	memset(r,0,sizeof(r));
	memset(m,0,sizeof(m));
	flag=0;
}
int main()
{
	while(~scanf("%d%d",&M,&n))
	{
		if(M==0&&n==0) break;
		for(int i=1;i<=M;++i)
		{
			getchar();
			for(int j=1;j<=n;++j)
			{
				cin>>t[i][j];
				if(t[i][j]=='S'){ s.x=i;s.y=j; }
				if('a'<=t[i][j]&&t[i][j]<='e'){	key[t[i][j]-'a']++; }//保存一下每种钥匙的数量 
				if(t[i][j]>='A'&&t[i][j]<='E') locx[t[i][j]-'A']=i,locy[t[i][j]-'A']=j; //存放每一个门的位置 
//				if('A'<=t[i][j]&&t[i][j]<='E'){ m[t[i][j]-'A'].x=i; m[t[i][j]-'A'].y=j; 	}//保存一下门的位置 
			}
		}
		
		do
		{
			memcpy(r,key,sizeof(r));
			memset(vis,0,sizeof(vis));
			DFS(s.x,s.y);
		}while(check());
		if(flag){		cout<<"YES\n";	}
		else	{		cout<<"NO\n";	    }	
		inti();
	}
	return 0;	
} 

  

猜你喜欢

转载自www.cnblogs.com/chrysanthemum/p/12275762.html