首页 > 其他分享 >洛谷P1126 机器人搬重物

洛谷P1126 机器人搬重物

时间:2024-12-21 19:21:49浏览次数:3  
标签:node 洛谷 di sum 重物 vis dx dy P1126

题目描述

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N × M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:

  • 向前移动 1 步(Creep);
  • 向前移动 2 步(Walk);
  • 向前移动 3 步(Run);
  • 向左转(Left);
  • 向右转(Right)。

每个指令所需要的时间为 1 秒。请你计算一下机器人完成任务所需的最少时间。
第一行为两个正整数 N,M (1≤N,M≤50),下面 N 行是储藏室的构造,0 表示无障碍,1 表示有障碍,数字之间用一个空格隔开。接着一行有 4 个整数和 1 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西 W,北 N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 -1。

正文

这道题的各种操作时间代价都是一秒,因此BFS就可以啦
请注意!

  1. 机器人有体积,check函数中将左上左下右上右下判断一遍就可以啦
  2. 机器人不能穿墙因此在判断走两三格时判断要加上途径每一格的判断
#include<bits/stdc++.h>
using namespace std;
const int N = 52;
int mp[N][N],n,m,sx,sy,ex,ey,dir,vis[N][N][4],cnt;
char d;
int dx[4] = {0,-1,0,1},dy[4] = {1,0,-1,0};//位移数组 
struct node{
	int x,y,sum,di;
};
queue<node> q;
// 检查该点合法性 
bool check(node t) {return t.x+1<=n && t.x>=1 && t.y>=1 && t.y+1<=m && mp[t.x][t.y] && mp[t.x+1][t.y] && mp[t.x][t.y+1] && mp[t.x+1][t.y+1];}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	memset(vis,0x3f,sizeof(vis)); 
	cin>>n>>m;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) {cin>>mp[i][j];mp[i][j] = 1-mp[i][j];}
	cin>>sx>>sy>>ex>>ey>>d;
	if(d=='S') dir = 3;
	if(d=='E') dir = 0;
	if(d=='N') dir = 1;
	if(d=='W') dir = 2;//对应上方位移数组 
	q.push(node{sx,sy,0,dir});
	while(!q.empty()){
		node t = q.front();
		q.pop();
		if(t.x==ex && t.y==ey) {cout<<t.sum;return 0;}
		//五行超长判断,分别为走一格,两格,三格,右转,调头 
		if(check(node{t.x+dx[t.di],t.y+dy[t.di],0,0}) && vis[t.x+dx[t.di]][t.y+dy[t.di]][t.di]>t.sum+1) q.push(node{t.x+dx[t.di],t.y+dy[t.di],t.sum+1,t.di}),vis[t.x+dx[t.di]][t.y+dy[t.di]][t.di] = t.sum+1;
		if(check(node{t.x+dx[t.di],t.y+dy[t.di],0,0}) && check(node{t.x+2*dx[t.di],t.y+2*dy[t.di],0,0}) && vis[t.x+2*dx[t.di]][t.y+2*dy[t.di]][t.di]>t.sum+1) q.push(node{t.x+2*dx[t.di],t.y+2*dy[t.di],t.sum+1,t.di}),vis[t.x+2*dx[t.di]][t.y+2*dy[t.di]][t.di] = t.sum+1;
		if(check(node{t.x+dx[t.di],t.y+dy[t.di],0,0}) && check(node{t.x+2*dx[t.di],t.y+2*dy[t.di],0,0}) && check(node{t.x+3*dx[t.di],t.y+3*dy[t.di],0,0}) && vis[t.x+3*dx[t.di]][t.y+3*dy[t.di]][t.di]>t.sum+1) q.push(node{t.x+3*dx[t.di],t.y+3*dy[t.di],t.sum+1,t.di}),vis[t.x+3*dx[t.di]][t.y+3*dy[t.di]][t.di] = t.sum+1;
		if(vis[t.x][t.y][(t.di+1)%4]>t.sum+1) q.push(node{t.x,t.y,t.sum+1,(t.di+1)%4}),vis[t.x][t.y][(t.di+1)%4] = t.sum+1;
		if(vis[t.x][t.y][(t.di+3)%4]>t.sum+1) q.push(node{t.x,t.y,t.sum+1,(t.di+3)%4}),vis[t.x][t.y][(t.di+1)%4] = t.sum+1;
	}
	cout<<-1;//无解,即所有状态均不能到达 
	return 0;
}

标签:node,洛谷,di,sum,重物,vis,dx,dy,P1126
From: https://www.cnblogs.com/OrangeRED/p/18621056

相关文章

  • 笛卡尔树 (附洛谷模板题代码)
    前言打了一场\(\rm{codeforces}\),其中F使用了笛卡尔树,看起来这个东西的优先级比矩快还高,那就学一下似乎这道题并没有使用很多笛卡尔树的性质,但是\(\rm{yishu2}\)开了个专题,这下不得不学了笛卡尔树之前预习的时候看了一下首先复习一下二叉查找树的性质每个......
  • 洛谷 P11337 「COI 2019」IZLET 题解
    如果每条边连接的两个点颜色都不相同,那么可以使用如下策略确定每个点的颜色:令\(c_{i,j}\)为\(i\)到\(j\)的路径上的颜色数。对于每个点\(u\),以其为根进行一次dfs,往下找直到找到一个和它颜色相同的或者一个叶子就回溯,如果遇到颜色相同的就将它们在并查集上合并。考虑如何......
  • 洛谷题单指南-线段树-Points
    原题链接:https://www.luogu.com.cn/problem/CF19D题意解读:坐标系支持集中操作:1.添加一个点(x,y),保证不会重复2.删除一个点(x,y)3.查询刚好比一个点(x,y)的x,y都大的点,优先看刚好比x大的位置,如果该位置有多个点,取y最小的一个,找到则输出点的坐标,找不到则输出-1。解题思路:首先,可......
  • 洛谷Java写 P5727冰雹猜想
    题目再现:        给出一个正整数n,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘3 再加1,否则除以2。经过若干次循环后,最终都会回到11。经过验证很大的数字(7*10^11)都可以按照这样的方式比变成 11,所以被称为“冰雹猜想”。例如当n是20,变化的过程是......
  • 洛谷P2756 飞行员配对方案问题
    题目洛谷P2756飞行员配对方案问题题目大意一共有n个飞行员前m个外籍飞行员,后(n-m)个则为英国飞行员一个外籍飞行员与英国飞行员进行匹配,求最大配合数思路不难看出本题考察匈牙利算法本体真正意思是给定一个二分图其左部点的个数为m右部点的个数为(n-m)求其最大匹配的边......
  • 洛谷P2240部分背包问题
    2024-12-18-第39篇洛谷贪心算法题单-贪心算法-学习笔记作者(Author):郑龙浩/仟濹(CSND账号名)P2240【深基12.例1】部分背包问题题目描述阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N......
  • [洛谷P4772]灰化肥,会挥发
    题目Description在FarmerJustin的农场中有许多灰化肥,它们都堆积在A仓库里。为了方便施肥,FarmerJustin需要修一些公路使得他能用拖拉机把这些灰化肥拉到其他仓库里。由于FarmerJustin及其懒惰,所以他只想一次拉完所有的灰化肥送到其他仓库里。但是灰化肥见光易挥发,所以......
  • 洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言(链表队列写法)
    题目: https://www.luogu.com.cn/problem/B3644 题目描述有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。 输入格式第1行一个整数N(1≤N≤100),表示家族的人数。接下来N行,第i行......
  • 20241217每日一题洛谷P1803
    普及-每日一题洛谷P1683题目描述现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个及以上的......
  • 洛谷P7911 [CSP-J 2021] 网络连接题解
    普通的模拟题,数据很小,基本排除超时超空间的可能上代码:#include<bits/stdc++.h>#defineLLlonglongusingnamespacestd;vector<pair<int,string>>sv;//用于存储Server,sv[i].first代表Server编号,sv[i].second代表Server地址intturn(stringstr){//string转int if(str.......