迷宫寻宝(一)

时间限制: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. oracle的隐式游标

    游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...

  2. TCP面试题之滑动窗口原理

    TCP 滑动窗口 作用: 1. 提供TCP可靠性:对发送的数据进行确认 2. 流量控制:窗口大小随链路变化 一.TCP窗口机制 TCP中窗口大小是指tcp协议一次传输多少个数据.因为TCP是一个面向连 ...

  3. mysql5.6免安装配置(菜鸟版)

    mysql5.6免安装配置 MySQL5.6.13安装步骤(Windows7 32位) 1. 下载MySQL Community Server 5.6.13 2. 解压MySQL压缩包 将以下载的My ...

  4. Android BroadcastReceiver使用

    1. 介绍 BroadcastReceiver用于接收广播事件(Intent), 是Android四大组件之一 2. 使用 2.1  实现广播接收类 实现一个广播收类继承BroadcastReceiv ...

  5. UVA 10986 Sending email 最短路问题

    基本的最短路问题 就是数据需要稍微处理一下.(N比较大)dijkstra也要优化.不优化应该会T: #include <map> #include <set> #include ...

  6. java中数组有没有length()方法?string没有lenght()方法?

    java中数组有没有length()方法,求数组的长度可以使用数组的length属性. int[] arr={1,2,3,4,5}; int length=arr.length;//求数组的长度 -- ...

  7. (2) python--pandas

    import pandas as pd import numpy as np # 创建的Series几种方式 s1 = pd.Series(range(4)) s2 = pd.Series([0, 1 ...

  8. 虚拟机linux 挂载windows共享目录 给linux的nginx服务器使用

    mount -t cifs -o username=administrator,password=xxxx,file_mode=0777,dir_mode=0777 //192.168.xx.xxx/ ...

  9. 51nod 1096 距离之和最小【中位数】

    1096 距离之和最小 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 X轴上有N个点,求X轴上一点使它到这N个点的距离之和最小,输出这个最小的距离 ...

  10. Python的程序结构[2] -> 类/Class[5] -> 内建类 bytes 和 bytearray

    内建类 bytes 和 bytearray / Built-in Type bytes and bytearray 关于内建类 Python的内建类 bytes 主要有以下几点: class byte ...