http://acm.zznu.edu.cn/problem.php?id=1962

题目描述

在很多 RPG (Role-playing Games) 游戏中,迷宫往往是非常复杂的游戏环节。通常来说,我们在走迷宫的时候都需要花非常多的时间来尝试不同的路径。但如果有了算法和计算机的帮助,我们能不能有更快的方式来解决这个问题?我们可以进行一些尝试。

现在我们有一个 N 行 M 列的迷宫。迷宫的每个格子如果是空地则可以站人,如果是障碍则不行。在一个格子上,我们可以一步移动到它相邻的 8 个空地上,但不能离开地图的边界或者跨过两个障碍的夹缝。下图是一个移动规则的示例。

为了离开迷宫,我们还需要触发迷宫中所有的机关。迷宫里总共有 K 个机关,每个机关都落在一个不同的空地上。如果我们到达了某个机关所在的格子时,这个机关就会被自动触发,并在触发之后立即消失。我们的目标是按顺序触发所有的 K             个机关,而当最后一个机关被触发时,我们就可以离开迷宫了。

现在我们已经拿到了迷宫地图,并且知道所有障碍、机关的位置。初始时我们位于迷宫的某个非障碍格子上,请你计算我们最少需要移动多少步才能离开迷宫?

输入

输入的第一行是测试数据的组数 T (T ≤ 20)。

对于每组测试数据:第一行包含地图的行数 N (2 ≤ N  ≤ 100),列数 M(2 ≤ M  ≤ 100) 和机关的数量 K(1 ≤ K ≤10)。接下来 N 行,每行包含 M 个字符,其中字符 ‘#’ 表示障碍,而 ‘.’ 表示空地。接下来一行描述了我们的初始位置 (x, y),表示我们一开始在第 x 行第 y 列的格子上。这个格子保证是个空地。接下来 K 行,每行给出了一个机关的位置。所有的机关都不会出现在障碍上,并且任意两个机关不会出现在同一个空地上。我们需要按输入给定的顺序触发所有的 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

提示

 

来源

2015轻院校赛

只需要注意起始点不能是机关, 但是如果只有一个点的话, 起始点是可以是机关的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue> using namespace std; #define N 110
#define met(a, b) memset(a, b, sizeof(a)) using namespace std; const int dir[][] = {{-,-},{-,},{-,},{,-},{,},{,-,},{,},{,}}; struct node
{
int x, y, step;
}JG[N]; int n, m, k, vis[N][N];
char G[N][N]; bool Judge(int x, int y)
{
if(x>= && x<=n && y>= && y<=m && !vis[x][y] && (G[x][y]=='.' || G[x][y]=='@'))
return ;
return ;
} int BFS(int w)
{
node p, q;
p = JG[w];
p.step = ; queue<node>Q;
Q.push(p); memset(vis, , sizeof(vis));
vis[p.x][p.y] = ;
G[JG[w+].x][JG[w+].y] = '@'; while(Q.size())
{
p = Q.front(); Q.pop(); if(G[p.x][p.y]=='@')
{
G[p.x][p.y] = '.';
return p.step;
} for(int i=; i<; i++)
{
q.x = p.x + dir[i][];
q.y = p.y + dir[i][];
q.step = p.step + ; if(i== || i== || i== || i==)
{
if(Judge(q.x, q.y))
{
vis[q.x][q.y] = ;
Q.push(q);
}
}
else if(i==)
{
if(Judge(q.x, q.y))
{
if(G[p.x-][p.y]=='#' && G[p.x][p.y-]=='#') continue;
vis[q.x][q.y] = ;
Q.push(q);
}
}
else if(i==)
{
if(Judge(q.x, q.y))
{
if(G[p.x-][p.y]=='#' && G[p.x][p.y+]=='#') continue;
vis[q.x][q.y] = ;
Q.push(q);
}
}
else if(i==)
{
if(Judge(q.x, q.y))
{
if(G[p.x+][p.y]=='#' && G[p.x][p.y-]=='#') continue;
vis[q.x][q.y] = ;
Q.push(q);
}
}
else ///if(i==7)
{
if(Judge(q.x, q.y))
{
if(G[p.x+][p.y]=='#' && G[p.x][p.y+]=='#') continue;
vis[q.x][q.y] = ;
Q.push(q);
}
} }
}
return -;
} int main ()
{
int t; scanf("%d", &t); while(t--)
{
int i, ans, sum=; scanf("%d%d%d", &n, &m, &k); memset(G, , sizeof(G)); for(i=; i<=n; i++)
scanf("%s", G[i]+); scanf("%d%d", &JG[].x, &JG[].y);
for(i=; i<=k; i++)
{
scanf("%d%d", &JG[i].x, &JG[i].y);
G[JG[i].x][JG[i].y] = '*';
} if(G[JG[].x][JG[].y]=='*' && k!=)
{
printf("-1\n");
continue;
} for(i=; i<k; i++) ///第i次查找
{
ans = BFS(i);
if(ans==-) break;
sum += ans;
} if(ans==-) printf("-1\n");
else printf("%d\n", sum);
}
return ;
}

广搜 迷宫(zznu 1962)的更多相关文章

  1. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  2. hrbust 1621 迷宫问题II 广搜

    题目链接:http://acm.hrbust.edu.cn/vj/index.php?/vj/index.php?c=&c=contest-contest&cid=134#proble ...

  3. hdu 1072 广搜(逃离爆炸迷宫)

    题意: 在n×m的地图上,0表示墙,1表示空地,2表示人,3表示目的地,4表示有定时炸弹重启器.定时炸弹的时间是6,人走一步所需要的时间是1.每次可以上.下.左.右移动一格.当人走到4时如果炸弹的时间 ...

  4. POJ 3984 迷宫问题 记录路径的广搜

    主要是学一下如何在广搜中记录路径:每找到一个点我就记录下这个点是由那个点得来的,这样我找到最后个点后,我就可以通过回溯得到我走过的路径,具体看代码吧~ #include<cstdio> # ...

  5. HDU 1253 (简单三维广搜) 胜利大逃亡

    奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 //#define LOCAL #include <ios ...

  6. 解救小哈——bfs广搜

    问题描述: 小哈去玩迷宫,结果迷路了,小哼去救小哈.迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物. 问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径 ...

  7. hdu 1253 胜利大逃亡 (广搜)

    题目链接 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个ABC的立方体,可以被表示成A个 ...

  8. HDU 1010 Tempter of the Bone (广搜+减枝)

    题目链接 Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. How ...

  9. hdu 1253:胜利大逃亡(基础广搜BFS)

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. 梦殇 chapter one

    梦殇 chapter one 星梦 天空中飘着几片云,喝着小鸟的欢呼声,这一切似乎显得愈加可爱了. 不觉间已经到了2013年,错过的12年,似乎在向我们招手,不知道远方的朋友们,你们还好吗? 是否也会 ...

  2. sqlserver 分区排序之partition

    例如:按照课程分组取各个课程最高成绩的记录,使用partition分区,然后按照成绩倒序排列,需要注意的是考虑到可能出现多个相同最高分,使用dense_rank来实现连续排序. 参考链接:https: ...

  3. python sockerserver tcp 文件下载 udp

    #tcp serverclass MyHandler(socketserver.BaseRequestHandler): def handle(self): # 通信循环 while True: tr ...

  4. dev accordionControl panelcontorl 使用

    对于dev的窗体布局我想更系统的专业的学学,不是评自己以往 的经验去做, 所以我看了dev的demo 里边的例子,封装的很严实,还有他们自己重新做的控件,无法直接使用, 关键的控件也上了锁,可能也是保 ...

  5. linux 管道符与通配符

    ###管道符 *命令格: 命令1 | 命令2 //命令1的正确输出作为命令2的操作对象 ll | more netstat -an | grep xxx 通配符 类似于正则表达式 ? 一个以上 [] ...

  6. win8+iis8+PHP5安装配置和Zend Optimizer安装教程

    安装 Zend Optimizer       下载地址:http://www.onlinedown.net/soft/32228.htm 下载直接双击安装即可,安装过程要你选择 Web Server ...

  7. Laravel Many to Many Polymorphic Relationship

    Many to many Polymorphic relationship is also a little bit complicated to understand. For example, i ...

  8. [SoapUI] 通过JSONAssert比较两个环境的JSON Response,定制化错误信息到Excel

    package ScriptLibrary; import org.json.JSONArray; import org.json.JSONException; import org.json.JSO ...

  9. 关键词提取_textbank

    脱离语料库,仅对单篇文档提取 (1) pageRank算法:有向无权,平均分配贡献度 基本思路: 链接数量:一个网页越被其他的网页链接,说明这个网页越重要 链接质量:一个网页被一个越高权值的网页链接, ...

  10. oracle银行卡卡号计算函数

    create or replace function GetCardNoBySerialNo(v_sysacc varchar2,v_position number) return varchar2 ...