题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=82

AC代码:讲解,先统计在可搜索范围内对应的钥匙数,把搜到的门存到另外的一个队列中,第一个搜索结束后,开始看搜到的钥匙能否打看门,

如果能打看门,存到第一个队列中,在进行搜寻,知道找到宝藏,或者什么也没有找到,则退出;

AC代码:

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
using namespace std;
map<char,int >key;
map<char,int >key1;
int dir[][]={,-,,,-,,,};
char mapp[][];
int vis[][];
int s1,s2,e1,e2,m,n;
struct T
{
int x,y;
}now,eed;
struct KEY
{
int x,y;
}ee,nn;
int bfs()
{
vis[s1][s2]=;
queue< T >aa;
queue< KEY >bb;
now.x=s1; now.y=s2;
aa.push(now);
while()
{
while(!aa.empty())//搜寻可以搜的地方,搜到门,存到下一个队列中;
{
eed=aa.front();
aa.pop();
if(eed.x==e1 && eed.y==e2)
return ;
for(int i=; i<; i++)
{
now.x=eed.x+dir[i][];now.y=eed.y+dir[i][];
if(now.x> && now.x<=m && now.y> && now.y<=n && mapp[now.x][now.y]!='X' && vis[now.x][now.y]==)
{
if(mapp[now.x][now.y]>='a' && mapp[now.x][now.y]<='e')// 钥匙
{ key1[mapp[now.x][now.y]]++,aa.push(now); }
else if(mapp[now.x][now.y]=='.' || mapp[now.x][now.y]=='G')
aa.push(now);
else if(mapp[now.x][now.y]>='A' && mapp[now.x][now.y]<='E')
{
nn.x=now.x; nn.y=now.y;
bb.push(nn);
}
vis[now.x][now.y]=;
}
}
}
int siz=bb.size();
while(!bb.empty() && siz--)//遍历搜到的门,看能否打开,如果能的话,存到第一个队列中,再次搜索;
{
nn=bb.front();
if(key[mapp[nn.x][nn.y]+]==key1[mapp[nn.x][nn.y]+] && key[mapp[nn.x][nn.y]+]>)
{ now.x=nn.x;now.y=nn.y;
aa.push(now);bb.pop();
}
else bb.push(nn),bb.pop();
}
if(aa.empty())//如果队列1,为空证明,路已经走不下去了,结束搜索;
return ;
}
return ;
}
int main()
{
while(cin>>m>>n && m+n)
{
key.clear();key1.clear();
memset(vis,,sizeof(vis));
for(int i=; i<=m ;i++)
for(int j= ;j<=n; j++)
{
cin>>mapp[i][j];
if(mapp[i][j]=='S')
s1=i,s2=j;
else if(mapp[i][j]=='G')
e1=i,e2=j;
else if(mapp[i][j]>='a' && mapp[i][j]<='e')//统计总共的钥匙的个数;
key[mapp[i][j]]++;
}
int ans=bfs();
if(ans==)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return ;
//3 4
//S.XX
//.aXB
//b.AG
}

ny82 迷宫寻宝(一) map+queue的更多相关文章

  1. nyoj 82 迷宫寻宝(一)

    点击打开链接 迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫 ...

  2. 迷宫寻宝(一)(bfs)

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...

  3. NYOJ82 迷宫寻宝(一)【BFS】

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 一个叫ACM的寻宝者找到了一个藏宝图.它依据藏宝图找到了一个迷宫,这是一个非常特别的迷宫,迷宫里有N个 ...

  4. Problem 2285 迷宫寻宝 (BFS)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2285 Problem 2285 迷宫寻宝 Accept: 323    Submit: 1247Time Li ...

  5. 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝

    Problem B 迷宫寻宝 Accept: 52    Submit: 183Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem De ...

  6. Unity3D实现立体迷宫寻宝

    Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...

  7. Java中的容器类(List,Set,Map,Queue)

    Java中的容器类(List,Set,Map,Queue) 一.基本概念 Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1)Collection.一个独立元素的序列,这些元素都 ...

  8. hdoj--5233--Gunner II(map+queue&&二分)

     Gunner II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  9. Problem 2285 迷宫寻宝

    http://acm.fzu.edu.cn/problem.php?pid=2285 Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入 ...

随机推荐

  1. pgfplots画二维图真的很方便,多例比较

    %直接PDFLATEX编译即可\documentclass[border=1mm]{standalone}\usepackage{tkz-euclide,pgfplots}\begin{documen ...

  2. javascript正则中ASCII与unicode

    正则表达式中允许直接利用ASCII和Unicode编码来查找我们相应的字符串. ASCII: 下面是检索ASCII编码在x41-x7a范围内的所有匹配的字符串.(x41,x7a为十六进制) var s ...

  3. JQuery选择器中的一些注意事项

    1. 选择器中含有特殊符号的注意事项 1. 1 选择器中含有",","#","("或"]"等特殊字符 根据w3c的规定, ...

  4. SQL Server-数据库中强varchar类型使用sum函数计算总和

    select sum(cast(totalmoney AS DECIMAL)) as totalmoney from dbo.t_wxbill

  5. Java实现MySQL图片存取操作

    转载自:http://blog.csdn.net/thc1987/article/details/3972201 存入操作 /* ---------------表结构------------ 表名:s ...

  6. zabbix_LAMP源码安装

    Zabbix源码包安装 Cenos5.3 Basic server 安装顺序 Libxml2 Libmcrypt Zlib Libpng Jpeg:需要创建目录jpeg /bin /lib /incl ...

  7. 4CIF是什么意思

    QCIF:176X144 CIF:352X288 2CIF:704X288 DCIF:584X384 4CIF:704X576 CIF是常用的标准化图像格式(Common Intermediate F ...

  8. FFMpeg框架代码阅读

    http://blog.csdn.net/wstarx/article/details/1572393 FFMPEG源码分析(二) http://www.cnblogs.com/qingquan/ar ...

  9. Oracle DMP 操作笔记之根据DMP逆向推导出导出的表空间名称

    最近在带着一群.NET新兵们在开发和升级一套系统,本人虽然工作好几年,但是也是属于啥都懂一点,啥都不会的队伍,碰到新兵更是蛋都碎了,还特别拘谨,为啥新兵们都是基础知识很不错的,看来要好好练习内功了,好 ...

  10. Android Studio修改项目名和包名

    为了提高开发效率,有时候需要使用现有的一些开源项目,记录一下自己修改项目名和包名的方法. 1.首先,修改包名(清单文件里找), ①展开所有包 ②选中想要修改的包,shift+F6(也可右键Refact ...