STL双向队列下的广搜——好奇怪的游戏
这是一道适合初学搜索的人刷的一道广搜题,然而我写了个神奇的双向队列,估计我是唯一用双向队列写的这道题的人吧。
因为有两匹马,一白一黑,所以我本意是想用单个deque代替两个queue。
然而看了题解,发现好像queue也可以做,看来还是我想多了
具体说这道题之前,我们先来简单了解一下双向队列这个东东(就当是科普了)。
首先,双向队列(deque)是STL中的一个容器
定义的方法如下:
#include<deque>
deque <int>q;
注意,头文件是deque而不是queue(当然也可以像我一样直接bits/stdc++。.h行天下)
接下来是操作;
顾名思义,双向队列是可以进行头尾同时操作的队列,其进出和vector有些相似
q.push_back();//从尾进
q.push_front();//从头进
q.pop_back();//从尾出
q.pop_front();//从头出
q.empty()//是否为空
相比queue,deque还有特殊的功能:
q.clear()//一键清空队列;
cout<<q[1];//随机访问;
deque就像是综合了queue和vector优点的神器!
接下来我们回到这道题,看看deque的特性如何在这体现。 先康康定义
int a[hs][hs];
struct node
{
int x;
int y;
int minns;
};
//结构体封装,更方便!
int sa[13]={0,2,2,-2,-2,-1,-1,1,1,-2,-2,2,2};//用数组预存能走的12个方向,
int sb[13]={0,2,-2,2,-2,-2,2,-2,2,1,-1,1,-1};//省的到时候不停的if—else
int xa,xb,ya,yb;
deque <node>m;今天的主角,双向队列
inline int bfs(int x,int y);
接下来是广搜程序
inline int bfs(int x,int y)
{
node n;
n.x=x;//横坐标
n.y=y;//纵坐标
n.minns=0;//最短路
m.push_back(n);//从尾进
do
{
n=m.front();
m.pop_front();//从头出(注意别从尾出了,这样队列就变成栈了)
for(fint i=1;i<=12;i++)
{
node o;
o.x=n.x+sa[i];
o.y=n.y+sb[i];//跳马
if(o.x==1&&o.y==1&&a[o.x][o.y]==0)
return o.minns;
else
if(o.x>=1&&o.y>=1&&a[o.x][o.y]==0)
{
a[o.x][o.y]=1;
o.minns=n.minns+1;//最短路增加
m.push_back(o);//接着进队
}
}
}
while(!m.empty());
}
还是比较基础易懂的。 最后是异常简洁的主程序
signed main()
{
cin>>xa>>ya>>xb>>yb;
cout<<bfs(xa,ya)<<endl;第一匹马
memset(a,0,sizeof(a));//快速清空数组,省去循环嵌套
m.clear();deque的一键清空特性
cout<<bfs(xb,yb);第二匹马
return 0;
}
好了,这样就结束了,如果想更好了解deque,建议做做->P1886
P1886AC代码点我
祝大家AC愉快!