/*
【BFS广度优先搜索】【queue队列】【洛谷P1126】
https://www.luogu.com.cn/problem/P1126
记录一下:一发AC 写了一个小时
写了很多BFS+queue的题目 模板都一样
基本上就是考察方向上面的判别和一些细节
*/
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int x,y;
char toward;
int sum;
};
int nums[60][60][2];
int n,m;
int dis[4][3][2]={{-1,0,-2,0,-3,0},{0,-1,0,-2,0,-3},{2,0,3,0,4,0},{0,2,0,3,0,4}};
bool check(int x,int y)
{
return x>=1&&y>=1&&x<=n&&y<=m;
}
void bfs(int x,int y,char ch)
{
queue<node> q;
q.push({x,y,ch,0});
while(!q.empty())
{
node a=q.front();q.pop();
if(nums[a.x][a.y][1]!=-1&&nums[a.x][a.y][1]<=a.sum||nums[a.x][a.y][0]==1) continue;
nums[a.x][a.y][1]=a.sum;
//走N 1 2 3步
for(int i=0;i<3;i++)
{
int X=a.x+dis[0][i][0];
int Y=a.y+dis[0][i][1];
if(check(X,Y)&&check(X,Y+1)&&nums[X][Y][0]==0&&nums[X][Y+1][0]==0)
{
if(a.toward=='N'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+1))
{
q.push({X,Y,'N',a.sum+1});
}
else if(a.toward=='S'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+3)){
q.push({X,Y,'N',a.sum+3});
}
else if((a.toward=='E'||a.toward=='W')&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+2)){
q.push({X,Y,'N',a.sum+2});
}
}
else
break;
}
//走W 1 2 3步
for(int i=0;i<3;i++)
{
int X=a.x+dis[1][i][0];
int Y=a.y+dis[1][i][1];
if(check(X,Y)&&check(X+1,Y)&&nums[X][Y][0]==0&&nums[X+1][Y][0]==0)
{
if(a.toward=='W'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+1))
{
q.push({X,Y,'W',a.sum+1});
}
else if(a.toward=='E'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+2)){
q.push({X,Y,'W',a.sum+3});
}
else if((a.toward=='S'||a.toward=='N')&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+2)){
q.push({X,Y,'W',a.sum+2});
}
}
else
break;
}
//走S 1 2 3步
for(int i=0;i<3;i++)
{
int X=a.x+dis[2][i][0];
int Y=a.y+dis[2][i][1];
if(check(X,Y)&&check(X,Y+1)&&nums[X][Y][0]==0&&nums[X][Y+1][0]==0)
{
if(a.toward=='S'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+1))
{
q.push({X-1,Y,'S',a.sum+1});
}
else if(a.toward=='N'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+3)){
q.push({X-1,Y,'S',a.sum+3});
}
else if((a.toward=='E'||a.toward=='W')&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+2)){
q.push({X-1,Y,'S',a.sum+2});
}
}
else
break;
}
//走E 1 2 3步
for(int i=0;i<3;i++)
{
int X=a.x+dis[3][i][0];
int Y=a.y+dis[3][i][1];
if(check(X+1,Y)&&check(X,Y)&&nums[X][Y][0]==0&&nums[X+1][Y][0]==0)
{
if(a.toward=='E'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+1))
{
q.push({X,Y-1,'E',a.sum+1});
}
else if(a.toward=='W'&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+3)){
q.push({X,Y-1,'E',a.sum+3});
}
else if((a.toward=='N'||a.toward=='S')&&(nums[X][Y][1]==-1||nums[X][Y][1]>a.sum+2)){
q.push({X,Y-1,'E',a.sum+2});
}
}
else
break;
}
}
}
int main()
{
memset(nums,-1,sizeof(nums));
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>nums[i][j][0];
int x,y,gx,gy;
char ch;
cin>>x>>y>>gx>>gy>>ch;
bfs(x,y,ch);
cout<<nums[gx][gy][1];
return 0;
}
【BFS广度优先搜索】【queue队列】【洛谷P1126】
本文详细记录了一道使用BFS(广度优先搜索)和队列解决的洛谷P1126题目,主要考察了方向判断和细节处理。代码实现了一个一小时完成并获得AC(Accepted)的解决方案,通过遍历四个方向(N,S,E,W)并判断不同步长的可能性更新网格状态。
摘要由CSDN通过智能技术生成