【BFS广度优先搜索】【queue队列】【洛谷P1126】

本文详细记录了一道使用BFS(广度优先搜索)和队列解决的洛谷P1126题目,主要考察了方向判断和细节处理。代码实现了一个一小时完成并获得AC(Accepted)的解决方案,通过遍历四个方向(N,S,E,W)并判断不同步长的可能性更新网格状态。
摘要由CSDN通过智能技术生成

传送门

/*
	【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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值