拯救行动(变种bfs)
总时间限制: 10000ms 内存限制: 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”
样例输入
(输入gg了,想看的直接看原题吧,http://bailian.openjudge.cn/practice/4116/)
样例输出
13
7
题解:BFS做这道题,与往常不同的是,这道题的answer会更新,不能遇见a就输出,而且如果遇到x,step加的是2,不是1。而且由于各个节点会更新,所以没有vis数组,这时候就要根据此种方法是否能够使结果更优来判断是否继续。
思考:
1、一道简单题做了1天,还是太弱。
2、可以用结构体存储到现在的步数。
3、由于路径不同,所以可能结果会更新,不能看到a就退出。
4、要用一个数组存储到达每一个节点的最短时间,如果需要更新再push等等,如果不需要更新,就不用push。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>using namespace std;struct point
{int x, y, step;point(int xx, int yy, int s) : x(xx), y(yy), step(s) {}
};const int maxn = 205;
const int INF = 1 << 30;
char maze[maxn][maxn];
int time1[maxn][maxn], dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int n, m, answer;
point r(0, 0, 0);void BFS()
{queue<point> q;q.push(r);time1[r.x][r.y] = 0;//记录到达这个地方的上一个节点需要多长时间while (!q.empty()){point now = q.front();q.pop();if (maze[now.x][now.y] == 'a')//由于是在结构体里面存储的是走到这个地方所需时间,所以要在这里判断{answer = min (answer, now.step);}else{for (int i = 0; i < 4; i++){int tempx = now.x + dir[i][0];int tempy = now.y + dir[i][1];if (tempx < 1 || tempx > n || tempy < 1 || tempy > m || maze[tempx][tempy] == '#' || now.step >= time1[tempx][tempy] || now.step >= answer) continue;//如果超边界或者到上一步时所需时间已经比原来的更大,则跳if (maze[tempx][tempy] == 'x'){time1[tempx][tempy] = now.step;//记录到达上一个状态所需时间q.push(point(tempx, tempy, now.step + 2));//step里面记录到达这个状态所需时间}else{time1[tempx][tempy] = now.step;q.push(point(tempx, tempy, now.step + 1));}}}}
}int main()
{
#ifndef ONLINE_JUDGEfreopen ("in.txt", "r", stdin);
#endif // ONLINE_JUDGEint t;scanf ("%d", &t);while (t--){memset (maze, '\0', sizeof(maze));answer = INF;scanf ("%d%d", &n, &m);for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> maze[i][j];if (maze[i][j] == 'r'){r.x = i;r.y = j;r.step = 0;}time1[i][j] = INF;}}BFS ();if (answer == INF){printf ("Impossible");}else{printf ("%d", answer);}if (t != 0) printf ("\n");}return 0;
}
拯救行动(变种bfs)相关推荐
- HDOJ水题集合5:杂题
1001 拯救丁爸 BFS模板 拯救丁爸 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- 搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)
拯救同伴问题 问题描述:假设有如下迷宫,求解从某一点出发到目标位置的最短距离 Input: 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 Ou ...
- 【数据结构笔记22】图的遍历例题:拯救007(应用DFS)、六度空间(应用BFS)
本次笔记内容: 6.3 应用实例:拯救007 6.4 六度空间 文章目录 拯救007 题目与分析 题目 分析 总体算法 六度空间(Six Degrees of Separation) 题目 算法思路 ...
- 2843 拯救炜哥 (bfs)
题目描述 Description 有一天,炜哥和欧能干一起去大魔王家里做(dao)客(luan),不巧被魔王发现了.魔王将炜哥和欧能干抓走了,关在了两个不同的房间里.魔王听说吃炜哥的肉可以长生不老(炜 ...
- BFS 搜索 Problem 1012 Rescue 拯救天使
Problem ID:1012 Rescue 简单题意:给出一个地图,其中有一个"a",代表angle,若干个"r",代表去营救angle的朋友,"x ...
- 拯救天使 (BFS)
题目: 1242 Rescue 1 //这是一个比较标准的bfs,没有经过任何优化,但是思路比较清晰,容易看懂. 2 #include <iostream> 3 #include < ...
- [SDOI2012]拯救小云公主【bfs+二分答案】
题目链接 正难则反. 要直接求从起点到终点的最大距离,不妨反过来求最小的可以阻止骑士从起点到终点的对于全体圆的最小半径. 那么,就是阻止从左上角到右下角的所有相交圆,于是,就是要变成没有从左上角到右下 ...
- [luogu] P2498 [SDOI2012]拯救小云公主 二分答案+bfs
前言 以为二分的是人到BOOS的距离 没想到可以直接二分BOOS的攻击距离 传送门 : 思路 BFS待研究 CODE typedef pair<int,int> pii; map<i ...
- P1506 拯救oibh总部(洛谷 BFS)
#include<bits/stdc++.h> using namespace std; const int N = 1000; //提前读取 * 的个数 在最外围建立额外 0 圈 方便B ...
最新文章
- Linux下C语言使用、编译与调试
- Linux文件权限基本配置
- ImageLoader设置圆形图片
- ionic 页面传值问题
- SQL Server性能调优--优化建议(二)
- Give root password for maintenance 问题的解决方法
- centos下的nginx安装工作记录20130701
- 8. Document getElementById() 方法
- php框架laravel手册,Laravel 5 框架入门(一)
- 2017CS231n李飞飞深度视觉识别笔记(八)——深度学习 软件
- C# Wpf Binding 使用详解
- Drug Target Review | 人工智能(AI)在基因组学中的作用
- 从SAP顾问教JAVA开发说起
- python大数据计算_大数据计算平台 python
- yarn WEB UI及reserved memory、spark WEB UI
- unity 实现手机震动
- 计算机中选中多个文件的快捷键,电脑操作过程中同时选定多个文件的方法
- Oracle EBS教学视频
- NVIDIA GPU硬件架构发展(截至2022年)
- AcWing1488. 最短距离
热门文章
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO和util、service、tool
- 呕心沥血60道Vue、Vue-Router、Vuex面试题及详解!
- Vue重复点击同一个路由报错问题解决
- 用阿里云托管服务器怎么托管_云托管就像圣诞老人的4种方式
- 计算机械功的公式,机械功的计算
- 羧基水溶性量子点(PEG)标记鼻咽癌标志物EB病毒核EBNA1抗原|PEG-NH2修饰CdSe/ZnS 量子点(520nm)
- 【拼多多笔试题】小熊战斗力
- 全面解读居住证积分新政,赶紧看看你离落户上海还有多远!
- idea Translation翻译插件详细讲解
- Android的手势操作(Gesture)