机器人搬重物

链接

这道题目有方向和体积

我们假设机器人初始坐标为(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)

全部评论

相关推荐

01-03 10:09
门头沟学院 Java
上周二视频面试,摄像头刚打开,面试官笑容和蔼:“看你简历写了‘精通分布式架构’,先聊聊Java基础吧——HashMap在多线程环境下会有什么问题?”我盯着屏幕右下角的时间:14:03。距离秋招结束还有28天,距离我上一次认真复习集合框架……大概隔了一个毕业设计、三个重构需求,和老板那句“这个需求很简单,明天上线就行”。手指悬在键盘上,脑子里的Java虚拟机比我的职业生涯还安静。那一刻我懂了:技术人的翻车现场,往往始于简历里那个膨胀的“精通”。2025年即将清零,作为一枚被“泡池子”泡出包浆的校招生,我含泪忏悔三宗罪:1.&nbsp;简历成了“技术许愿池”,投币时忘了许愿机要收基础题税为了在300+简历中突围,我把技能栏塞得像双十一购物车:从“熟悉K8s编排”到“掌握全链路压测”,连“了解量子计算”都想往上蹭(别问,问就是GitHub标过star)。结果某厂二面,面试官指着“JVM调优”问:“G1回收器Region大小怎么设置?”我脱口而出:“呃……和内存条价格有关?”真相是:HC再诱人,也架不住面试官一句“你连synchronized和ReentrantLock区别都说不清”。&nbsp;公司招的是修路工,不是画地图的。2.&nbsp;沉迷“高大上”,把基础当祖传代码不敢动整整半年,我对着B站“三天搞定Spring&nbsp;Cloud”教程热血沸腾,却让《Java核心技术》在书架上积灰。直到某次终面,面试官问:“String的intern()方法是干啥的?”我张了张嘴,仿佛听见了童年梦想碎裂的声音——就像产品经理说“这个需求不用改,就加个按钮”。后来才醒悟:微服务拆得再漂亮,也挡不住一道手写单例模式的考题。&nbsp;毕竟,没人会为“能画出12层架构图”买单,但所有人会为“改需求时代码不崩”鼓掌。3.&nbsp;刷题拖到秋招倒计时,LeetCode成了赎罪券7月还在想“刷题是应试教育”,10月才在牛客刷到崩溃。面试白板前,看着“反转链表”题干,手抖得像刚写完bug的实习生。面试官叹气:“这题我们实习生都……”&nbsp;我默默把简历上“算法能力突出”划掉了——有些债,秋招不会等你分期还。忏悔不是终点。最近我做了三件小事:✅&nbsp;简历大扫除:把“精通”全换成“用过”,像删掉祖传代码里的注释一样痛快;✅&nbsp;每天早饭前啃30分钟《Java编程思想》,配豆浆更入味;✅&nbsp;刷题从“每日一题”开始,专治面试时的手抖后遗症。2025年或许没收到梦中情司的offer,但至少摸清了技术人的生存法则:简历的厚度不重要,重要的是当面试官问“final能修饰类吗”,你能笑着答“能,就像我的决心”而不心虚。别怕基础弱——我们又不是JVM,生下来就要加载类。真正的成长,是从把“技术愿望清单”改成“今日Todo&nbsp;List”开始的。2026年,愿我们的简历少点“大师”,多点“能跑通”。
查看6道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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