4116:拯救行动
总时间限制: 1000ms 内存限制: 65536kB
描述
公主被恶人抓走,被关押在牢房的某个地方。牢房用N*M (N, M <= 200)的矩阵来表示。矩阵中的每项可以代表道路(@)、墙壁(#)、和守卫(x)。
英勇的骑士(r)决定孤身一人去拯救公主(a)。我们假设拯救成功的表示是“骑士到达了公主所在的位置”。由于在通往公主所在位置的道路中可能遇到守卫,骑士一旦遇到守卫,必须杀死守卫才能继续前进。
现假设骑士可以向上、下、左、右四个方向移动,每移动一个位置需要1个单位时间,杀死一个守卫需要花费额外的1个单位时间。同时假设骑士足够强壮,有能力杀死所有的守卫。

给定牢房矩阵,公主、骑士和守卫在矩阵中的位置,请你计算拯救行动成功需要花费最短时间。

输入
第一行为一个整数S,表示输入的数据的组数(多组输入)
随后有S组数据,每组数据按如下格式输入
1、两个整数代表N和M, (N, M <= 200).
2、随后N行,每行有M个字符。"@"代表道路,"a"代表公主,"r"代表骑士,"x"代表守卫, "#“代表墙壁。
输出
如果拯救行动成功,输出一个整数,表示行动的最短时间。
如果不可能成功,输出"Impossible”
样例输入
2
7 8
#@#####@
#@a#@@r@
#@@#x@@@
@@#@@#@#
#@@@##@@
@#@@@@@@
@@@@@@@@
13 40
@x@@##x@#x@x#xxxx##@#x@x@@#x#@#x#@@x@#@x
xx###x@x#@@##xx@@@#@x@@#x@xxx@@#x@#x@@x@
#@x#@x#x#@@##@@x#@xx#xxx@@x##@@@#@x@@x@x
@##x@@@x#xx#@@#xxxx#@@x@x@#@x@@@x@#@#x@#
@#xxxxx##@@x##x@xxx@@#x@x####@@@x#x##@#@
#xxx#@#x##xxxx@@#xx@@@x@xxx#@#xxx@x#####
#x@xxxx#@x@@@@##@x#xx#xxx@#xx#@#####x#@x
xx##@#@x##x##x#@x#@a#xx@##@#@##xx@#@@x@x
x#x#@x@#x#@##@xrx@x#xxxx@##x##xx#@#x@xx@
#x@@#@###x##x@x#@@#@@x@x@@xx@@@@##@@x@@x
x#xx@x###@xxx#@#x#@@###@#@##@x#@x@#@@#@@
#@#x@x#x#x###@x@@xxx####x@x##@x####xx#@x
#x#@x#x######@@#x@#xxxx#xx@@@#xx#x#####@
样例输出
13
7

问题链接:Bailian 拯救行动
问题简述:(略)
问题分析:使用优先搜索来解决,用优先队列来实现,其他都是套路。走一格,如果没有守卫则只需要1个单位时间,如果有守卫则需要2个单位时间。因为是求最优解的问题,需要用优先搜索,即先试着从那些到目前为止时间花费最少的情况往下走,才有可能找到最优解。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* Bailian4116 拯救行动 */#include <bits/stdc++.h>using namespace std;const int N = 200;
char b[N][N + 1];
bool vis[N][N];
struct Node {int row, col, time;Node(int r, int c, int t):row(r), col(c),time(t){}friend bool operator<(Node a, Node b){return a.time > b.time;}
};
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
const int DL = sizeof(dr) / sizeof(int);int main()
{int s, n, m;scanf("%d", &s);while(s--) {priority_queue<Node> q;scanf("%d%d", &n, &m);getchar();for(int i = 0; i < n; i++)scanf("%s", b[i]);memset(vis, false, sizeof(vis));int tr, tc, cnt = 0;for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(b[i][j] == 'r') {q.push(Node(i, j, 0));vis[i][j] = true;if(++cnt == 2) break;} else if(b[i][j] == 'a') {tr = i;tc = j;if(++cnt == 2) break;}while(!q.empty()) {Node t = q.top();if(t.row == tr && t.col == tc) break;q.pop();for(int i = 0; i < DL; i++) {int nrow = t.row + dr[i];int ncol = t.col + dc[i];if(nrow < 0 || nrow >= n || ncol < 0 || ncol >= m)continue;if(vis[nrow][ncol] || b[nrow][ncol] == '#')continue;vis[nrow][ncol] = true;if(b[nrow][ncol] == 'x')q.push(Node(nrow, ncol, t.time + 2));else if(b[nrow][ncol] == '@' || b[nrow][ncol] == 'a')q.push(Node(nrow, ncol, t.time + 1));}}if(q.empty())puts("Impossible");elseprintf("%d\n", q.top().time);}return 0;
}

Bailian4116 拯救行动【优先搜索】相关推荐

  1. C++ 算法篇 广度(宽度)优先搜索(BFS)

    广度优先遍历 广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS. 图的BFS类似于树的层序遍历. 广度优先遍历 如图将左边的图变形,得到右边的图,然后一层一层的 ...

  2. 【BFS宽度优先搜索】

    一.求所有顶点到s顶点的最小步数   1 //BFS宽度优先搜索 2 #include<iostream> 3 using namespace std; 4 #include<que ...

  3. 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)

    文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...

  4. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次"解救小哈"的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLi ...

  5. POJ-2488 A Knights Journey-深度优先搜索DFS

    POJ-2488 A Knights Journey-深度优先搜索 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37974 A ...

  6. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

  7. BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题

    BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题 参考文章: (1)BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题 (2)https://www.cnblogs.com/qq9526 ...

  8. 八数码问题的三种解决方式,其一:宽度优先搜索

    老师要求写一下八数码问题的三种解决方法,,,哎真的是苦了孩子了,只有在网上找找大佬们的代码来扩展了一下思路才勉强写出来,这里也分享一下自己的理解. 宽度优先与深度优先算法在八数码问题上的主要操作大同小 ...

  9. 野人与传教士——宽度优先搜索(完整报告,含全部代码)

    题目: 野人与传教士渡河问题:3个野人与3个传教士打算乘一条船到对岸去,该船一次最多能运2个人,在任何时候野人人数超过传教士人数,野人就会把传教士吃掉,如何用这条船把所有人安全的送到对岸?在实现基本程 ...

最新文章

  1. 角度编码器 ST-3806-15-RS
  2. TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!...
  3. 关于自适应宽度圆角的最简单的解决办法
  4. STL系列之一 deque双向队列
  5. 电信aep平台是什么意思_江苏天鼎证券:股票平台跳水是什么意思?股票为什么会跳水?...
  6. 实现textarea限制输入字数
  7. torch.randn【返回从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数】
  8. word手写字体以假乱真_轻松制作个人“电子版手写签名”
  9. LeetCode每日一题:比特位计数(No.338)
  10. 【Windows 8 Store App】学习二:ResourceLoader
  11. [POJ1035]Spell checker
  12. 云开发校园微社区兼职交友小程序源码+支持二手交易
  13. 《21天学通C语言(第6版•修订版)》一1.7 问与答
  14. 上班划水,给男朋友做个数字炸弹游戏
  15. Windows 10 修改文件夹图标
  16. 实现简单的英文字母大小写转换
  17. 基于Milton的webdav解决方案 - Test
  18. 盈余贝分享网赚项目的思维和观念
  19. Unity Shader之uv旋转
  20. strapi终于装好了,网速太慢了,处理了一下代理,新建了一个.zshrc文件,加入了pon和poff两个函数

热门文章

  1. GDAL对空间数据的管理
  2. html中什么是围堵标签,HTML回顾(基础标签)
  3. ArcGIS水文分析实战教程(7)细说流域提取
  4. Flash: 涅磐与重生
  5. C#实现文件二进制存储
  6. 六、Mysql体系架构、存储引擎、临时表
  7. sun.misc jar包
  8. 数据切片与MapTask并行度
  9. kafka消费者如何读同一生产者消息_Kafka系列3:深入理解Kafka消费者
  10. java钓鱼_基于java的鱼友约钓鱼的系统