迷宫寻宝(一)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描写叙述

一个叫ACM的寻宝者找到了一个藏宝图。它依据藏宝图找到了一个迷宫,这是一个非常特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏。ACM必须打开门。可是,开门之前必须在迷宫里找到这个打开这个门所需的全部钥匙(每一个门都至少有一把钥匙),比如:如今A门有三把钥匙,ACM就必须找全三把钥匙才干打开A门。如今请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。

输入
输入可能会有多组測试数据(不超过10组)。

每组測试数据的第一行包括了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符。描写叙述了迷宫的布局。当中每一个字符的含义例如以下:

.表示能够走的路

S:表示ACM的出发点

G表示宝藏的位置

X表示这里有墙,ACM无法进入或者穿过。

A,B,C,D,E表示这里是门,a,b,c,d,e表示相应大写字母的门上的钥匙。

注意ACM仅仅能在迷宫里向上下左右四个方向移动。



最后。输入0 0表示输入结束。

输出
每行输出一个YES表示ACM能找到宝藏。输出NO表示ACM找不到宝藏。
例子输入
4 4
S.X.
a.X.
..XG
....
3 4
S.Xa
.aXB
b.AG
0 0
例子输出
YES
NO

好题。做了两天才过。。

#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using std::vector;
using std::queue;
struct Node{
int x, y;
} start;
queue<Node> Q;
vector<Node> door[5];
int m, n, tkey[5], key[5], vis[22][22];
char map[22][22];
const int mov[][2] = {0, 1, 0, -1, -1, 0, 1, 0}; bool checkOpenDoor(char ch){
return key[ch - 'A'] == tkey[ch - 'A'];
} //check函数的作用:1、推断点是否越界 2、推断是否已经訪问或为墙壁
//3、是否为钥匙,若是则更新钥匙且推断是否能打开门。如能则将之前入栈
//的门入队 4、推断是否为门。若是再推断是否能打开,若不能则入栈且返回0
bool check(Node t){
if(t.x < 0 || t.y < 0 || t.x >= m || t.y >= n)
return 0;
if(vis[t.x][t.y] || map[t.x][t.y] == 'X')
return 0; char ch = map[t.x][t.y];
if(ch >= 'a' && ch <= 'e'){
++key[ch - 'a'];
while(key[ch - 'a'] == tkey[ch - 'a'] && !door[ch - 'a'].empty()){
Q.push(door[ch - 'a'].back());
door[ch - 'a'].pop_back();
}
} if(ch >= 'A' && ch <= 'E' && !checkOpenDoor(ch)){
door[ch - 'A'].push_back(t);
vis[t.x][t.y] = 1;
return 0;
} return 1;
} void BFS(){
for(int i = 0; i < 5; ++i)
door[i].clear();
while(!Q.empty()) Q.pop(); vis[start.x][start.y] = 1;
Q.push(start);
Node temp, now; while(!Q.empty()){
now = Q.front(); Q.pop(); for(int i = 0; i < 4; ++i){
temp = now;
temp.x += mov[i][0];
temp.y += mov[i][1]; if(check(temp)){
if(map[temp.x][temp.y] == 'G'){
puts("YES"); return;
}
vis[temp.x][temp.y] = 1;
Q.push(temp);
}
}
} puts("NO");
} int main(){
char ch;
while(scanf("%d%d", &m, &n), m || n){
memset(tkey, 0, sizeof(tkey));
memset(key, 0, sizeof(key));
memset(vis, 0, sizeof(vis)); for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
ch = getchar();
if(ch == ' ' || ch == '\n'){
--j; continue;
} map[i][j] = ch;
if(ch >= 'a' && ch <= 'e')
++tkey[ch - 'a'];
else if(ch == 'S'){
start.x = i; start.y = j;
}
}
} BFS();
}
return 0;
}

NYOJ82 迷宫寻宝(一)【BFS】的更多相关文章

  1. Problem 2285 迷宫寻宝 (BFS)

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

  2. 【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题

    [题目链接:NYOJ-82] #include<iostream> #include<cstring> using namespace std; struct node{ in ...

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

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

  4. nyoj 82 迷宫寻宝(一)

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

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

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

  6. Unity3D实现立体迷宫寻宝

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

  7. POJ.3894 迷宫问题 (BFS+记录路径)

    POJ.3894 迷宫问题 (BFS+记录路径) 题意分析 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, ...

  8. nyist 82迷宫寻宝(一)(BFS)

    题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 此题在基础BFS上加入了门和钥匙,要找齐所有钥匙才能开门,所以要对门特殊处理. 1.先 ...

  9. Problem 2285 迷宫寻宝

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

随机推荐

  1. Ubuntu14连接MySql报错“can't connect to local mysql server through socket '/var/run/mysqld/mysqld.sock'”

    起因:我在Ubuntu14 64位系统中安装mysql后,后来通过mysql -u用户名 -p密码 的命令连接 Mysql数据库时,报错"can't connect to local mys ...

  2. CodeForces 659D Bicycle Race (判断点是否为危险点)

    D - Bicycle Race Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u S ...

  3. C 随机不重复元素~转

    随机产生不重复元素:如何高效产生m个n范围内的不重复随机数(m<=n) 如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生.这 ...

  4. 基于UDT connect连接通信以及文件传输--服务端

    网上与UDT相关的资料不多,与UDT相关的源码例子更少.最近在接触UDT,也是因为缺少相关的资料,导致学习起来甚感痛苦.下面将我自己这两天弄出来的代码贴出来,希望对在寻找相关资料的童鞋有一定的帮助.与 ...

  5. Java异常throws与throw的区别

    throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.谁调用谁处理: 抛出异常throws: ...

  6. Java反射常用API汇总

    “JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性” 一.类对象的获取 1.通过对象获取 Object obj = ne ...

  7. Centos7下yum安装mongodb

    简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自 ...

  8. mysql 故障整理(2)

    导入备份数据时报错. mysql> system mysql -uroot -p < /root/mingongge_bak.sqlEnter password: ERROR 1840 ( ...

  9. 【转载】使用 PIVOT 和 UNPIVOT

    可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执 ...

  10. Laravel中ajax添加CsrfToken的方法

    //在模板文件的header头中添加 <meta name="_token" content="{{ csrf_token() }}"/> //aj ...