nyoj1246 逃离妖洞 BFS
逃离妖洞
- 描述
-
唐僧不小心又掉入妖怪的迷宫了。这个迷宫有n行m列,共n*m个方格。有的方格是空的,唐僧可以站在上面,有些是有障碍物的不能站。每次唐僧可以移动到相邻的8个空方格上。但是有些情况不能移动,即从两个方格的缝隙中移动,如图:
为了逃出妖怪的洞穴,唐僧需要触发悟空在某个方格留下的宝物,宝物都是留在空的方格中的。如果唐僧站在某个留有宝物的方格中,那么这个宝物就会被触发。为了逃离妖洞,唐僧务必按顺序依次触发K个宝物,当最后一个宝物被触发后,唐僧将会逃离妖洞。
现在唐僧已经知道这个迷宫中的障碍方格和有宝物的方格情况,开始唐僧站在一个给定的方格。问他是否可以逃离妖洞?
- 输入
- 一共有T(T<=20)组测试数据。
每组含有行数n,列数m。(2<=n,m<=100)以及放有宝物的K(1<= K <=10)个方格。
下面n行,每行包含m个字符,用'.'表示空的方格,用'#'表示有障碍物的方格。
下面一行是起点位置(x,y),保证是空的方格。
下面的K行表示藏有宝物的空方格的位置,藏有宝物的方格是空的,没有障碍物。两个宝物不会放在同一个空方格中。需要按所给宝物顺序依次触发宝物。 - 输出
- 输出为了逃离妖洞,最少需要多少次移动。如果不能逃离,输出-1。
- 样例输入
-
3 3 3 2 ... ... ... 1 1 1 3 2 2 3 3 1 ... .#. ... 1 1 3 3 2 3 1 ..# .#. 1 1 2 3
- 样例输出
-
3 3 -1
值得注意的地方
1. 宝物必须依次触发,也就是说不能提前通过未触发的宝物。
2. 起点可能位于某个宝物上面,如果不是位于第1个宝物的坐标,那么唐僧不可能逃离的。
AC代码:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 100 + 5;
int d[maxn][maxn];
char G[maxn][maxn];
int n, m, k;
const int dx[] = {1,-1,0,0, 1,-1,-1,1};
const int dy[] = {0,0,1,-1, -1,-1,1,1};
struct node{
int x, y;
node(){
}
node(int x, int y):x(x), y(y){
}
}h[15];
int bfs(int x, int y, char g){
memset(d, -1, sizeof(d));
queue<node>q;
q.push(node(x, y));
d[x][y] = 0;
while(!q.empty()){
node p = q.front();
q.pop();
x = p.x, y = p.y;
if(G[x][y] == g) return d[x][y];
for(int i = 0; i < 8; ++i){
int px = x + dx[i], py = y + dy[i];
if(px < 0 || px >= n || py < 0 || py >= m || G[px][py] == '#' || G[px][py] > g || d[px][py] != -1) continue;
if(i >= 4 && G[x + dx[i]][y] == '#' && G[x][y + dy[i]] == '#') continue;
q.push(node(px, py));
d[px][py] = d[x][y] + 1;
}
}
return -1;
}
int solve(int x, int y){
if(G[x][y] == '#') return -1;
if(G[x][y] != '.' && G[x][y] > '0') return -1;
int ans = 0;
for(int i = 0; i < k; ++i){
int step = bfs(x, y, '0' + i);
if(step == -1) return -1;
ans += step;
x = h[i].x, y = h[i].y;
}
return ans;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < n; ++i){
scanf("%s", G[i]);
}
int x, y;
scanf("%d%d", &x, &y);
int x1, y1; //宝物的坐标
for(int i = 0; i < k; ++i){
scanf("%d%d", &x1, &y1);
h[i] = node(x1 - 1, y1 - 1);
G[x1 - 1][y1 - 1] = i + '0';
}
printf("%d\n",solve(x - 1, y - 1));
}
return 0;
}
如有不当之处欢迎指出!
nyoj1246 逃离妖洞 BFS的更多相关文章
- HDU 1728:逃离迷宫(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有 ...
- hdu1072 逃离迷宫系列 bfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1072/ 题意:逃离迷宫,路中可能有炸弹,总时间是6个单位,在有炸弹的位置,如果到达的时刻时间大于0,则恢复到6时 ...
- HDU 1728 逃离迷宫(BFS)
Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...
- [HIHO1328]逃离迷宫(bfs,位压)
题目链接:http://hihocoder.com/problemset/problem/1328 这个题bfs到时候不止要存当前的坐标,还要存当前有哪几把钥匙.因为5把钥匙,所以可以直接用位来存,这 ...
- HDU 1728 逃离迷宫【BFS】
题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...
- HDU 1728 逃离迷宫(DFS||BFS)
逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...
- 逃离迷宫(BFS)题解
Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...
- 2018年长沙理工大学第十三届程序设计竞赛 G 逃离迷宫 【BFS】
链接:https://www.nowcoder.com/acm/contest/96/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- HDU - 1728 逃离迷宫 【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1728 思路 BFS 一开始 从开始位置 往四周走 如果能走的话 这个时候 转弯次数都是0 我们的标记不 ...
随机推荐
- 微信支付JSAPI公众号支付授权目录
详情 http://yangjunwei.com/a/1815.html
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- Mysql基本命令一
一.清除mysql表中数据 delete from 表名;truncate table 表名;不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以 ...
- python--批量下载豆瓣图片之升级版本
周末下雨没法出门,刷刷豆瓣看看妹子,本想拿以前脚本下载点图片,结果发现运行失败,之前版本为<python--批量下载豆瓣图片>,报错HTTP Error 403: Forbidden,网上 ...
- 通过 ['1', '2', '3'].map(parseInt) 学习 map 和 parseInt 函数
看到一道笔试题: ['1', '2', '3'].map(parseInt) 这道题目中涉及到 map 和 parseInt 函数的运用,如果对这两个函数的理解不充分的话,是很难思考出正确的结果的. ...
- mysql数据库在windows下安装与配置
mysql是一种开源源代码的关系型数据库系统(RDBMS),使用最常用的数据库管理语言--结构化查询语句(SQL)进行数据库管理. MySQL是开放源代码的,因此任何人都可以在General Pu ...
- 锐捷配置telnet
.组网需求 通过Telnet功能远程登录管理设备. 二.组网拓扑 三.配置要点 1.需要给交换机配置一个管理IP,如果PC与交换机不是同一个网段,需要给交换机配置一个默认网关 2.需要配置一个 ...
- C语言对函数操作的结果声明
可以用来返回给调用者函数操作的状态值. /* 这是一份关于函数返回值定义的头文件. */ #ifndef _STATUS_H_ #define _STATUS_H_ #define STATUS in ...
- 用ASOS建立自定义的OpenID 服务(一)-----------简介
翻译文章 原文地址 这一系列共包括9个部分,这是第一部分,下面是英文原文地址: Introduction Choosing the right flow(s) Registering the midd ...
- python3操作redis
redis也被称为缓存 1.redis是一个key-value存储系统,没有ForeignKey和ManyToMany的字段. 2.在redis中创建的数据彼此之间是没有关系的,所以也被称为是非关系型 ...