BFS(搜索) (优先队列 ) HDU1242 Rescue

2024-04-23 21:08

本文主要是介绍BFS(搜索) (优先队列 ) HDU1242 Rescue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题面:

天使被MOLIGPY抓住了!他被Moligpy监禁。监狱被描述为N * M(N,M <= 200)矩阵。监狱里有WALL,ROAD和GUARD。

天使的朋友想要拯救天使。他们的任务是:接近天使。我们假设“接近天使”是为了到达Angel所在的位置。当网格中有一名后卫时,我们必须杀死他(或她?)才能进入网格。我们假设我们向上,向下,向右,向左移动需要1个单位时间,并且杀死一个守卫也需要1个单位时间。我们足够强大,可以杀死所有的守卫。

你必须计算接近天使的最短时间。 (当然,我们只能将UP,DOWN,LEFT和RIGHT移动到绑定范围内的邻居网格。)
输入
第一行包含两个整数代表N和M.

然后是N行,每行有M个字符。 “”代表道路,“a”代表Angel,“r”代表Angel的每个朋友。

处理到文件的末尾。
输出
对于每个测试用例,您的程序应输出一个整数,代表所需的最短时间。如果这样的数字不存在,你应该输出一行包含“贫穷的ANGEL必须一辈子留在监狱里”。

注意是多组输入:

#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
const int maxn=250;
using namespace std;
char maze[maxn][maxn];
int vis[maxn][maxn];
int n,m;
int res=-1;
typedef struct node
{int x;int y;int time;bool operator <(const node & b)const{return time>b.time;}
}point;
int a[]={0,0,1,-1};
int b[]={1,-1,0,0};
void bfs(int x,int y,int ox,int oy)
{	priority_queue<point>s;point p;p.x=x;p.y=y;p.time=1;vis[x][y]=1;s.push(p);while(!s.empty()){point t;t=s.top();s.pop();if(t.x==ox&&t.y==oy){res+=t.time;return ;}for(int i=0;i<4;i++){int xx=t.x+a[i];int yy=t.y+b[i];if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]!=1&&maze[xx][yy]!='#'){point q;q.x=xx;q.y=yy;if(maze[xx][yy]=='x')q.time=t.time+2;elseq.time=t.time+1;s.push(q);vis[xx][yy]=1;}	}	}		
}
int main()
{int i,j;int sx,sy;int ex,ey;while(cin>>n>>m){memset(vis,0,sizeof(vis));res=-1;for(i=0;i<n;i++)for(j=0;j<m;j++){cin>>maze[i][j];if(maze[i][j]=='r'){sx=i;sy=j;}if(maze[i][j]=='a'){ex=i;ey=j;}}bfs(sx,sy,ex,ey);if(res==-1)cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;elsecout<<res<<endl;		}	return 0;
}

这道题 ,如果不考虑士兵的话,(因为题数据问题),交一发纯BFS 求最短距离,就可以 AC。但是 ,不是总是数据有问题,这道题需要判断 需要过士兵,还是不过士兵,因为过士兵要 耗时 2个单位,如果绕过的话,可能会有更好的路线 ,说这就需要判断,我们就可以交给优先队列,按 时间 从小到大来排列。到时候,就会优先走时间少的路线,直到 a 天使处。

很好的思路,优先队列 + BFS 。

这篇关于BFS(搜索) (优先队列 ) HDU1242 Rescue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929888

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;