nyoj82 迷宫寻宝(一) 多次BFS

#include<iostream>
#include<cstdio>
#include<string.h>
#include<queue>
using namespace std;


struct node{
int x,y;
};
char mp[25][25],c;
int n,m,x1,y1,x2,y2;
int need[25],have[25];//需要的钥匙,拥有的钥匙 


int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};


int bfs()
{
int vis[25][25];
memset(vis,0,sizeof(vis));
int flag=0;
queue<node> q;
node u;
u.x=x1,u.y=y1;
vis[x1][y1]=1;
q.push(u);
while(!q.empty())
{
u=q.front();
if(u.x==x2&&u.y==y2)
return 1;
q.pop();
for(int i=0;i<4;i++){
int x=u.x+dx[i];
int y=u.y+dy[i];
char &p=mp[x][y];  // p 和 &p 区别   想想为什么不能用char p=mp[x][y];
if(x>n||x<=0||y>m||y<=0||vis[x][y]||p=='X')
continue;
if(p>='a'&&p<='e')
{
have[p-'a']++;
p='.';
flag=1;
}
if(p>='A'&&p<='E')
if(have[p-'A']<need[p-'A'])
continue;
node v;
v.x=x,v.y=y;
vis[x][y]=1;
q.push(v);
}
}
if(!flag)
return -1;//返回-1,说明手里的钥匙没有增加,这次找不到,以后也就没有找到宝藏的希望了 
else
return 0;//返回0 ,说明手里的钥匙增加了,或许下次bfs就能找到宝藏 
}
 
 int main()
 {
  while(~scanf("%d%d",&n,&m)&&n&&m){
  getchar();
  memset(have,0,sizeof(have));
  memset(need,0,sizeof(need));
  for(int i=1;i<=n;i++){
  for(int j=1;j<=m;j++){
  scanf("%c",&c);  
  mp[i][j]=c;
  if(c>='a'&&c<='e')//记录每把钥匙的数目 
  need[c-'a']++;
  if(c=='S'){x1=i;y1=j;}
if(c=='G'){x2=i,y2=j;}
}
getchar();//吸收换行符 
}
while(1)
{
int t=bfs();
if(t==1) {cout<<"YES"<<endl; break;}
if(t==0) continue;
if(t==-1) {cout<<"NO"<<endl; break;}
}
}
return 0;
 }
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值