P1126 机器人搬重物

题目地址:https://www.luogu.org/problem/P1126

看着机房孙哥再做这个题,我也尝试一波,没想到卡了这么长时间,总结一下,这题细节超多,一开始写了个有返回值的bfs,wa,还得注意转向的问题,走一步,两步,三步都是一秒,还有对初始坐标点的处理。。。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=50+10;
struct Node 
{
	int x;
	int y;
	int time;
	char dir;
};
int n,m,sx,sy,fx,fy,a[maxn][maxn],dis[4][2]={0,1,1,0,0,-1,-1,0};
int vis[maxn][maxn];
char c,s[4]={'S','W','N','E'};
queue<Node> q;
bool judge(int x,int y)
{
	bool error=false;
	if(a[x][y]==0&&x>=1&&y>=1&&x<n&&y<m&&a[x-1][y-1]==0&&a[x-1][y]==0&&a[x][y-1]==0)
	{
		error=false;
	}
	else error=true;
	if(error==true)
	return false;     	
	else 
	return true;
}
void bfs()
{
	while(!q.empty())
	{
		Node now=q.front();
		q.pop();
		char to=now.dir;
		int num;
		for(int i=0;i<4;i++)
		{
			if(s[i]==to) 
			num=i;
		}
		for(int i=0;i<4;i++)
		{
			int k=fabs(i-num),tx=now.x,ty=now.y,walk_2=0,walk_3=0;
			if(k==3) k=1;
			else if(k==2) k=2;
			else if(k==1) k=1;
			else if(k==0) k=0;
			if(i==0)tx++;
			if(i==1)ty--;
			if(i==2)tx--;
			if(i==3)ty++;
			if(judge(tx,ty))
			{	
				walk_2=1;
				if(vis[tx][ty]>now.time+k+1)
				{
					q.push({tx,ty,now.time+k+1,s[i]});
					vis[tx][ty]=now.time+k+1;
				}
			}
			if(walk_2==1)
			{
				if(i==0)tx++;
				if(i==1)ty--;
				if(i==2)tx--;
				if(i==3)ty++;
				if(judge(tx,ty))
				{
					walk_3=1;
					if(vis[tx][ty]>now.time+k+1)
					{
						q.push({tx,ty,now.time+k+1,s[i]});
						vis[tx][ty]=now.time+k+1;
					}	
				}
			}
			if(walk_3==1)
			{	
				if(i==0)tx++;
				if(i==1)ty--;
				if(i==2)tx--;
				if(i==3)ty++;
				if(judge(tx,ty))
				{
					if(vis[tx][ty]>now.time+k+1)
					{
						q.push({tx,ty,now.time+k+1,s[i]});
						vis[tx][ty]=now.time+k+1;
					}
				}
			}			
		}
	}
}
int main()
{
	memset(vis,inf,sizeof vis);
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++)
	for(int j=0;j<m;j++)
	scanf("%d",&a[i][j]);
	scanf("%d %d %d %d %c",&sx,&sy,&fx,&fy,&c);
	q.push({sx,sy,0,c});
	vis[sx][sy]=0;
	bfs(); 
	if(vis[fx][fy]==inf)
		printf("-1\n");
	else 
		printf("%d",vis[fx][fy]);
	return 0;
}

### 关于洛谷P1126机器人重物的题解 #### 问题描述 题目要求计算在一个由障碍物组成的矩形区域中,两个机器人分别从起点移动到终点运物品所需的最短路径长度之和。地图上的字符表示不同的地形特征,“.”代表可以通过的位置,“*”则意味着存在不可逾越的障碍。 #### 解决方案概述 为了求解这个问题,可以采用广度优先搜索算法(BFS),因为BFS能够有效地找到无权图中的最短路径。对于本题而言,需要两次独立执行BFS来获取各自机器人的最短路线距离矩阵;之后遍历整个网格以找出两者相遇点处的距离总和最小值作为最终答案[^1]。 #### Python代码实现 下面给出完整的Python程序用于解决此竞赛编程挑战: ```python from collections import deque def bfs(start, grid): n, m = len(grid), len(grid[0]) visited = [[False]*m for _ in range(n)] dist = [[-1]*m for _ in range(n)] queue = deque([start]) visited[start[0]][start[1]] = True dist[start[0]][start[1]] = 0 while queue: x, y = queue.popleft() directions = [(0,-1),(0,1),(-1,0),(1,0)] # 左右上下四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy if not (0<=nx<n and 0<=ny<m): continue if visited[nx][ny] or grid[nx][ny]=='*': continue visited[nx][ny]=True dist[nx][ny]=dist[x][y]+1 queue.append((nx,ny)) return dist n,m=map(int,input().split()) grid=[input()for _ in range(n)] sx,sy=-1,-1; ex,ey=-1,-1 for i in range(n): for j in range(m): if grid[i][j]=="E": ex, ey=i,j elif grid[i][j]=="S": sx, sy=i,j d1=bfs((sx,sy),grid) d2=bfs((ex,ey),grid) ans=float('inf') for i in range(n): for j in range(m): if d1[i][j]!=-1 and d2[i][j]!=-1: ans=min(ans,d1[i][j]+d2[i][j]) print(ans if ans!=float('inf') else -1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值