82-迷宫寻宝(一)

内存限制:64MB
时间限制:1000ms
特判: No

通过数:3
提交数:5
难度: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 分析:
  1、要用多次BFS,每当我们找到一把钥匙我们手里的钥匙就自加,如果此时没有找到宝藏,我们依然有资本再来一次BFS,因为此时我们多了一点打开门的把握;
  2、如果手里有的钥匙与要求开门的钥匙相同,那么这个门就可以打开,既然门打开了,如果此时我们没有找到宝藏,仍然有资本再来一次BFS
  3、当然,BFS结束的条件是找到宝藏,或者再也找不到钥匙,再也打不开门 C/C++代码实现(AC):
 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <set> using namespace std;
const int MAXN = ;
int flag, n, m, my_book[MAXN][MAXN], start_x, start_y, mov[][] = {{, }, {, }, {-, }, {, -}}, my_need[], my_have[];
char my_map[MAXN][MAXN];
struct node
{
int x, y;
}; bool my_match(node q)
{
if (q.x < || q.y < || q.x >= n || q.y >= m) return false;
if (my_map[q.x][q.y] == 'X') return false;
if (my_book[q.x][q.y]) return false;
if (my_map[q.x][q.y] >= 'a' && my_map[q.x][q.y] <= 'e')
{
flag = ;
my_have[my_map[q.x][q.y] - 'a'] ++;
my_map[q.x][q.y] = '.';
return true;
}
if (my_map[q.x][q.y] >= 'A' && my_map[q.x][q.y] <= 'E')
{
if (my_have[my_map[q.x][q.y] - 'A'] == my_need[my_map[q.x][q.y] - 'A'])
{
my_map[q.x][q.y] = '.'; // 可以通过加上 flag = 1 进行优化
return true;
}
return false;
}
if (my_map[q.x][q.y] == '.' || my_map[q.x][q.y] == 'G') return true;
} int bfs()
{
flag = ;
memset(my_book, , sizeof(my_book));
node q1, q2;
queue <node> Q;
q1.x = start_x, q1.y = start_y;
my_book[start_x][start_y] = ;
Q.push(q1);
while(!Q.empty())
{
q1 = Q.front();
if(my_map[q1.x][q1.y] == 'G') return ;
for(int i = ; i <= ; ++ i)
{
q2 = q1;
q2.x = q1.x + mov[i][];
q2.y = q1.y + mov[i][];
if (!my_match(q2)) continue;
my_book[q2.x][q2.y] = ;
Q.push(q2);
}
Q.pop();
}
if (flag) return ;
return ;
} int main()
{
while(~scanf("%d%d", &n, &m), n || m)
{
memset(my_need, , sizeof(my_need));
memset(my_have, , sizeof(my_have));
for(int i = ; i < n; ++ i)
{
getchar();
scanf("%s", my_map[i]);
for (int j = ; j < m; ++ j)
if (my_map[i][j] == 'S')
start_x = i,
start_y = j;
else if (my_map[i][j] >= 'a' && my_map[i][j] <= 'e')
my_need[my_map[i][j] - 'a'] ++;
} while()
{
int t = bfs();
if (t == )
{
printf("YES\n");
break;
}
else if (t == )
{
printf("NO\n");
break;
}
}
}
return ;
}

nyoj 82-迷宫寻宝(一) (多重BFS)的更多相关文章

  1. nyoj 82 迷宫寻宝(一)

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

  2. nyoj 82 迷宫寻宝(二)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=83 题目解法主要在于判断两线段是否相交,思路是穷举所有地图四周的点,其中每一个边界上的点和终点构成一 ...

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

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

  4. nyoj 83:迷宫寻宝(二)(计算几何)

    题目链接 枚举所有墙的2n个端点与宝物的位置作为一条线段(墙的端点必定与边界重合), 求出与之相交的最少线段数(判断线段相交时用跨立实验的方法),+1即为结果. #include<bits/st ...

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

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

  6. Problem 2285 迷宫寻宝 (BFS)

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

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

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

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

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

  9. Unity3D实现立体迷宫寻宝

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

随机推荐

  1. [LUOGU1272] 重建道路 - 树形背包

    题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系 ...

  2. opencv实践::对象提取与测量

    问题描述 照片是来自太空望远镜的星云图像,科学家想知道它的面 积与周长. 解决思路 方法一: 通过二值分割+图像形态学+轮廓提取 #include <opencv2/opencv.hpp> ...

  3. solr学习篇(二) solr 分词器篇

    关于solr7.4搭建与配置可以参考 solr7.4 安装配置篇  在这里我们探讨一下分词的配置 目录 关于分词 配置分词 验证成功 1.关于分词 1.分词是指将一个中文词语拆成若干个词,提供搜索引擎 ...

  4. 你的 Java 并发程序 Bug,100% 是这几个原因造成的

    可见性问题 可见性是指一个线程对共享变量进行了修改,其他线程能够立马看到该共享变量更新后的值,这视乎是一个合情合理的要求,但是在多线程的情况下,可能就要让你失望了,由于每个 CPU 都有自己的缓存,每 ...

  5. Asp.net WebApi的授权安全机制 Basic认证

    1:Home/index.cshtml下面的Html代码 <div> <input value="1点击先登陆" type="button" ...

  6. Leetcode Tags(13)Bit Manipulation

    一.477.汉明距离总和 输入: , , 输出: 解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010.(这样表示是为了体现后四位之间关系) HammingDistance( ...

  7. 设计模式(一)Iterator模式

    Iterator模式用于在数据集合中按照顺序遍历集合.即迭代器模式. 下面来看一段实现了迭代器模式的示例程序. 这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显 ...

  8. C#基本网络操作

    建档操作如ping,查询本机主机ip,同步异步查询局域网内主机,同步异步邮件发送等 1)ping 通过ping类测试网络 using System; using System.Text; using ...

  9. vue-route动态路由

    配置子路由: 路由的视图都需要使用view-router 子路由也可以嵌套路由使用: children来做嵌套如上图 使用location.页面name就可以做页面跳转 mounted:挂载,延迟跳转 ...

  10. PCES - alpha阶段测试报告

    测试计划 测试目的 本测试目的在于测试项目完成情况,以及分析测试结果,为下一轮开发提供解决方案 测试项目 学生用户登录测试 课程信息检索测试 服务器测试 在测试过程中出现的Bug 用户界面间的跳转逻辑 ...