这里帮助一下只学了广搜 只了解了队列却不知道什么是优先队列的小伙伴们普及一下优先队列的知识~
转自搜狗百科:
优先队列(priorityqueue)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出(largest-in,first-out)的行为特征。
还不会优先队列的小伙伴们可以来这个博客学习一下:
http://www.cppblog.com/shyli/archive/2007/04/06/21366.html
这里也贴上我的优先结构体队列的模板:
struct zuobiao
{
int x,y,output;
friend bool operator <(zuobiao a,zuobiao b)
{
return a.output>b.output;
}
};
priority_queues;
本题设计的理念涉及到两个解题关键点:1.最短路径找到出口.2.分别思考两种路径走法哪种更优.(过桥和走水上.)
普通用广搜找出口的题目大家做多了之后就有体会了~广搜是属于无脑找出口的一种方式(缺点)但是能那够活用.比如利用贪心思想(找到了第一个出口就直接return之类的用法)(优点)
虽然灵活但是比较无脑所以我们就要利用各种小技巧来补广搜的缺点(如以前博客中写的哈理工2074逃生).
还有这个题也是要用小技巧来解决缺点-----------------------------优先队列.
优先队列的用处就是来解决这个问题的关键所在.(用最少的步数解决问题)
这里贴上AC代码:并不是很难 理解起来还是比较容易的:
#include
#include
#include
#include
char a[12121][12121];
int m,n,d;
int qidianx,qidiany;
int zongdianx,zongdiany;
using namespace std;
struct zuobiao
{
int x,y,output;
friend bool operator <(zuobiao a,zuobiao b)
{
return a.output>b.output;
}
}now,nex;
int fx[4]={0,0,-1,1};
int fy[4]={1,-1,0,0};
void bfs(int x,int y)
{
now.x=x;
now.y=y;
now.output=0;
priority_queues;
s.push(now);
a[x][y]='#';
while(!s.empty())
{
now=s.top();
s.pop();
if(now.x==zongdianx&&now.y==zongdiany)
{
printf("%d\n",now.output+1);
return ;
}
for(int i=0;i<4;i++)
{
nex.x=now.x+fx[i];
nex.y=now.y+fy[i];
if(nex.x>=0&&nex.x=0&&nex.y
你可能感兴趣的:(搜索)