熟悉掌握队列和pair的用法
在边权为1的图中适用
eg1 :acwing 1076
迷宫问题
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N=1010,M=N*N;
typedef pair<int,int> pii;
int n;
int g[N][N];
pii q[M];
pii pre[N][N];
int bfs(int sx,int sy)
{
int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};
int tt=0,hh=0;
q[0]={sx,sy};
memset(pre,-1,sizeof pre);
pre[sx][sy]={0,0};
while(tt>=hh)
{
auto t = q[hh++];
if(t.x == 0 && t.y == 0) break;
for(int i=0;i<4;i++)
{
int a=t.x+dx[i],b=t.y+dy[i];
if(a<0||a>=n||b<0||b>=n) continue;
if(g[a][b]==1) continue;
if(pre[a][b].x!=-1) continue;
q[++tt]={a,b};
pre[a][b]=t;//记录转移路径
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>g[i][j];
bfs(n-1,n-1)//反向搜索在输出路径时简单些
pii t(0,0);
while(1)
{
cout<<t.x<<" "<<t.y<<endl;
if(t.x==n-1&&t.y==n-1) break;
t=pre[t.x][t.y];
}
return 0;
}
eg2:acwing1100
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m;
int dis[N];
int q[N];
int bfs()
{
memset(dis,-1,sizeof dis);
int tt=0,hh=0;
q[0]=n;
dis[n]=0;
while(tt>=hh)
{
int t=q[hh++];
if(t==m) return dis[t];
if(t+1<N && dis[t+1]==-1 ) q[++tt]=t+1,dis[t+1]=dis[t]+1;
if(t-1>=0 && dis[t-1]==-1 ) q[++tt]=t-1,dis[t-1]=dis[t]+1;
if(t+t<N && dis[t+t]==-1 ) q[++tt]=t+t,dis[t+t]=dis[t]+1;
}
return -1;
}
int main()
{
cin>>n>>m;
cout<<bfs()<<endl;
return 0;
}
eg3:acwing 188
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N=155,M=N*N;
typedef pair<int,int> pii;
int n,m;
char g[N][N];
pii q[M];
int dis[N][N];
int bfs(int sx,int sy)
{
int dx[]={1,2,2,1,-1,-2,-2,-1};
int dy[]={2,1,-1,-2,-2,-1,1,2};
int tt=0,hh=0;
q[0]={sx,sy};
memset(dis,-1,sizeof dis);
dis[sx][sy]=0;
while(hh<=tt)
{
auto t=q[hh++];
for(int i=0;i<8;i++)
{
int a=t.x+dx[i],b=t.y+dy[i];
if(a<0||a>=n||b<0||b>=m) continue;
if(g[a][b] == '*') continue;
if(dis[a][b]!=-1) continue;
if(g[a][b]=='H') return dis[t.x][t.y]+1;
q[++tt] = {a,b};
dis[a][b]=dis[t.x][t.y]+1;
}
}
return -1;
}
int main()
{
cin>>m>>n;
for(int i=0;i<n;i++) cin>>g[i];
int sx,sy;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[i][j]=='K') sx=i,sy=j;
cout<<bfs(sx,sy)<<endl;
return 0;
}