机器人搬重物

链接

这道题目有方向和体积

我们假设机器人初始坐标为(x,y),那么向东走就是(x,y+1)西(x,y-1)南(x+1,y)北(x-1,y)

那么我们可以设置方向数组

dx[4]={0,1,0,-1}

dy[4]={1,0,-1,0}

当然,由于转向还要时间,我们可以在设置visit二维标记数组的基础上添加方向概念

不妨设东为0,南为1,西为2,北为3

那么,visit就是三维数组了

由于机器人有体积,所以(x,y)到(x+1,y+1)都不能有障碍物

我们在设置一个障碍数组,初始话为0,然后根据四个格子是否有障碍物设为1

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
int n, m;
vector<vector<int>>mp;
vector<vector<int>>can_move;
//E:0 S:1 W:2 N:3
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
bool visit[50][50][4];
struct node {
	int x;
	int y;
	int dir;
	int time;
};
int bfs(int nx,int ny,int ndir,int tx,int ty) {
	queue<node>q;
	q.push({ nx,ny,ndir,0 });
	visit[nx][ny][ndir] = 1;
	while (!q.empty()) {
		node cur = q.front();
		q.pop();
		if (cur.x == tx && cur.y == ty) return cur.time;
		int dir = (cur.dir + 3) % 4;
		if (!visit[cur.x][cur.y][dir]) {
			visit[cur.x][cur.y][dir] = 1;
			q.push({ cur.x,cur.y,dir,cur.time + 1 });
		}
		dir = (cur.dir + 1) % 4;
		if (!visit[cur.x][cur.y][dir]) {
			visit[cur.x][cur.y][dir] = 1;
			q.push({ cur.x,cur.y,dir,cur.time + 1 });
		}
		for (int step = 1;step <= 3;step++) {
			int x = cur.x + dx[cur.dir] * step;
			int y = cur.y + dy[cur.dir] * step;
			bool ok = true;
			for (int k = 1;k <= step;k++) {
				int cx = cur.x + dx[cur.dir] * k;
				int cy = cur.y + dy[cur.dir] * k;
				if (cx<0||cx>=n-1||cy<0||cy>=m-1||!can_move[cx][cy]) {
					ok = 0;	
					break;
				}
			}
			if (!ok) break;
			if (!visit[x][y][cur.dir]) {
				visit[x][y][cur.dir] = 1;
				q.push({ x,y,cur.dir,cur.time + 1 });
			}
		}
	}
	return -1;
}
int main() {
	cin >> n >> m;
	mp.resize(n, vector<int>(m));
	for (int i = 0;i < n;i++) {
		for (int j = 0;j < m;j++) {
			cin >> mp[i][j];
		}
	}
	can_move.resize(n, vector<int>(m, 0));
	for (int i = 0;i < n - 1;i++) {
		for (int j = 0;j < m - 1;j++) {
			if (!mp[i][j] && !mp[i + 1][j] && !mp[i][j + 1] && !mp[i + 1][j + 1]) {
				can_move[i][j] = 1;
			}
		}
	}
	memset(visit, 0, sizeof(visit));
	int nx, ny, tx, ty;
	cin >> nx >> ny >> tx >> ty;
	int dir = 0;
	char Dir;
	cin >> Dir;
	if (Dir == 'E') dir = 0;
	else if (Dir == 'S') dir = 1;
	else if (Dir == 'W') dir = 2;
	else dir = 3;
	if (nx < 1 || nx >= n || ny < 1 || ny >= m  || !can_move[nx-1][ny-1]) {
		cout << -1 << endl;
		return 0;
	}
	if (tx < 1 || tx >= n  || ty < 1 || ty >= m  || !can_move[tx-1][ty-1]) {
		cout << -1 << endl;
		return 0;
	}
	cout << bfs(nx-1, ny-1, dir, tx-1, ty-1);
}

时间复杂度:O(nm)

空间复杂度:O(nm)

全部评论

相关推荐

12-17 20:43
吉林大学 Java
点赞 评论 收藏
分享
今天 09:19
门头沟学院 Java
工作中听到最受打击的一句...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
12-24 14:45
终面是&nbsp;2v1,一个&nbsp;HRBP&nbsp;加一个部门大老板,说是压力面,实则全程让人不适。部门主管从头至尾冷着脸,没一点表情;HRBP&nbsp;则全程假笑,那笑容看得人浑身发麻。HRBP&nbsp;先问了几个问题,我认真回答完,感觉她压根没听懂,也不追问,就尬在那儿。接着主管挑了我简历上一段经历追问,我刚说一半就被打断,说我跑题,就这一个点翻来覆去纠结追问了快&nbsp;10&nbsp;分钟,全程冷着脸,语气也特别冲。到了反问环节,我问工作时间,HRBP&nbsp;只轻飘飘说&nbsp;“正常”。我追问&nbsp;“正常是什么意思?是早九晚六吗?”,她才不情不愿地说是。我又问当地生活成本,她直接甩一句&nbsp;“网上能查到,自己去查”。我再问&nbsp;“从上一届管培生身上能看到哪些成长”,她居然说&nbsp;“你是外人,细节不好说”。客观说,有些回答或许合理,但配上她那皮笑肉不笑的表情,真的让人极度不适。全程主管除了揪着我简历追问那&nbsp;10&nbsp;分钟,其他时候要么不说话,要么就冷着脸,整个氛围压抑到极点。面到最后我实在憋不住了,挂掉电脑就忍不住哭了。事后越想越后悔:其实这个岗位和平台我本来就不是特别心仪,当时就该在反问环节直接怼回去,也不至于委屈成这样。后续更离谱,我在官网上查到自己挂了,去问对接的&nbsp;HR,微信消息发过去直接已读不回。行吧,这个部门我直接拉黑,以后再看到相关招聘,绕路走都嫌近!
你面试体验感最差/最好的...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务