队列操作
入队:push队尾
出队:pop队首
判断队列是否为空:while(!q.empty())
访问队首元素:front()
先访问对首,再拿对首
q.front()
q.pop()
//模板
q.push(初始状态)
while(!q.empty()){
a=q.front();
q.pop();
for(枚举a的所有可达状态v){
if(本状态v合法){
执行标记操作;
q.push(v);
}
}
}
P1443 马的遍历
思路
#include<bits/stdc++.h>
using namespace std;
//标记点
struct point{
int x,y;
};
int main(){
int n,m,x0,y0,ans[402][402];
int dx[8]={-1,-2,-2,-1,1,2,2,1};
int dy[8]={-2,-1,1,2,2,1,-1,-2};
queue<point>q;
memset(ans,-1,sizeof(ans));
cin>>n>>m>>x0>>y0;
ans[x0][y0]=0;
//将x0,y0放入queue中
point tp ={x0,y0},p;
q.push(tp);
while(!q.empty()){
tp=q.front();
q.pop();
for(int i=0;i<8;i++){
int x=dx[i]+tp.x;
int y=dy[i]+tp.y;
if(x>n||x<1||y<1||y>m||ans[x][y]!=-1) continue;
ans[x][y]=ans[tp.x][tp.y]+1;
p={x,y};
q.push(p);
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
return 0;
}
P1135 奇怪的电梯
#include<bits/stdc++.h>
using namespace std;
struct floors{
int up,down,step;
bool vis;
}fs[205];
int main(){
int n,a,b,temp;
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>temp;//可以往上往下走几步
fs[i].up=i+temp;
fs[i].down=i-temp;
fs[i].step=-1;
fs[i].vis=0;
}
queue<floors>q;
// 初始状态
fs[a].step=0;
fs[a].vis=1;
q.push(fs[a]);
while(!q.empty()){
//临时变量
floors f=q.front();
q.pop();
int u=f.up;
int d=f.down;
if(u>=1&&u<=n&&fs[u].vis==0){
fs[u].vis=1;
fs[u].step=f.step+1;
q.push(fs[u]);
}
if(d>=1&&d<=n&&fs[d].vis==0){
fs[d].vis=1;
fs[d].step=f.step+1;
q.push(fs[d]);
}
if(u==b||d==b) break;
}
cout<<fs[b].step;
return 0;
}