迷宫寻宝(一)(bfs)
迷宫寻宝(一)
- 描述
-
一个叫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题解:
- num记录钥匙的个数;神搜,搜到钥匙就加上,遇到门就判断,带个回溯;但是不知道对不对,还在判题中;
- bfs代码:
-
#include<stdio.h>
#include<string.h>
#include<queue>
#define mem(x) memset(x,0,sizeof(x))
using namespace std;
char map[][];
int vis[][];
int key[];
int disx[]={,,,-};
int disy[]={,-,,};
int M,N;
struct Node{
int x,y;
};
bool limit(Node a){
if(map[a.x][a.y]>='a'&&map[a.x][a.y]<='e')key[map[a.x][a.y]-'a']--;
if(map[a.x][a.y]=='G')return true;
return false;
}
void bfs(int sx,int sy){
queue<Node>dl;
Node a,b;
vis[sx][sy]=;
a.x=sx;a.y=sy;
dl.push(a);
while(!dl.empty()){
a=dl.front();
dl.pop();
if(limit(a)){
puts("YES");
return ;
}
if(map[a.x][a.y]>='A'&&map[a.x][a.y]<='E'){
if(!key[map[a.x][a.y]-'A'])map[a.x][a.y]='.';
else{
if(dl.empty())break;
dl.push(a);
continue;
}
}
for(int i=;i<;i++){
b.x=a.x+disx[i];
b.y=a.y+disy[i];
if(b.x<||b.y<||b.x>=M||b.y>=N||vis[b.x][b.y]||map[b.x][b.y]=='X')continue;
vis[b.x][b.y]=;
dl.push(b);
}
}
puts("NO");
}
int main(){
while(scanf("%d%d",&M,&N),M|N){
mem(vis);mem(key);
for(int i=;i<M;i++)scanf("%s",map[i]);
int sx,sy;
for(int x=;x<M;x++)for(int y=;y<N;y++){
if(map[x][y]>='a'&&map[x][y]<='e')key[map[x][y]-'a']++;
if(map[x][y]=='S')sx=x,sy=y;
}
bfs(sx,sy);
}
return ;
}
迷宫寻宝(一)(bfs)的更多相关文章
- Problem 2285 迷宫寻宝 (BFS)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2285 Problem 2285 迷宫寻宝 Accept: 323 Submit: 1247Time Li ...
- NYOJ82 迷宫寻宝(一)【BFS】
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 一个叫ACM的寻宝者找到了一个藏宝图.它依据藏宝图找到了一个迷宫,这是一个非常特别的迷宫,迷宫里有N个 ...
- nyoj 82 迷宫寻宝(一)
点击打开链接 迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫 ...
- 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝
Problem B 迷宫寻宝 Accept: 52 Submit: 183Time Limit: 1000 mSec Memory Limit : 32768 KB Problem De ...
- Unity3D实现立体迷宫寻宝
Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...
- POJ.3894 迷宫问题 (BFS+记录路径)
POJ.3894 迷宫问题 (BFS+记录路径) 题意分析 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, ...
- nyist 82迷宫寻宝(一)(BFS)
题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 此题在基础BFS上加入了门和钥匙,要找齐所有钥匙才能开门,所以要对门特殊处理. 1.先 ...
- Problem 2285 迷宫寻宝
http://acm.fzu.edu.cn/problem.php?pid=2285 Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入 ...
- POJ 3984 迷宫问题(BFS)
迷宫问题 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, ...
随机推荐
- android HttpGet 另开线程获取网络数据问题
android跨线程通讯可以使用android.os.Handler-android.os.Message这两类对象完成. public static void getResultForHttpGet ...
- HDU2114 Calculate S(n) (取模算术)
Calculate S(n) Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 十个JAVA程序员容易犯的错误
十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...
- 让app在ios6上具有ios7的扁平效果
使用cocoapods在工程中加入UI7Kit,关于UI7Kit请自行google. 加入到工程 如果没安装cocoapods,则安装.(http://www.cocoapods.org) 安装方法: ...
- 从ora10g 刷数据到 8I基本操作步骤
从ora10g 刷数据到 8I基本操作步骤 master :oracle 10g snapshot site: oralce 8i 在oracle 8i 中物化视图称为快照,oracle 8i建快照的 ...
- Android学习总结——Activity状态保存和恢复
Android中启动一个Activity如果点击Home键该Activity是不会被销毁的,但是当进行某些操作时某些数据就会丢失,如下: Java class: package com.king.ac ...
- SVG-1
<rect>矩形 <circle>圆 <ellipse>椭圆 <line>直线 <polyline>折线 <polygon>标签 ...
- dom处理配置文件_待完善
import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java ...
- hbase importtsv
hadoop jar hbase-server-0.98.1-cdh5.1.3.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,cf:imsi,cf:i ...
- 关于C#重写,隐藏的一些事
第一次开始写技术博客,不知该从何处下手,本人算是菜鸟一枚,每每看到博客园里面的大牛们分享的技术文章,只能望其项背,高不可攀.但细细想来,若不尝试着从小处从低处慢慢去积累分享,想要成为技术大牛也只能沦为 ...