洛谷P1126 机器人搬重物
洛谷1126 机器人搬重物
题目描述
机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N*M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。
输入输出格式
输入格式:
输入的第一行为两个正整数N,M(N,M<=50),下面N行是储藏室的构造,0表示无障碍,1表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出格式:
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-1。
输入输出样例
输入样例#1:
9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S
输出样例#1:
12
【思路】
BFS状态搜索。
思路简单,用x,y,dir,d描述状态信息,因为每个操作的时间均为1所以广搜最短路即可。
需要注意的是:
1、 因为机器人直径有1.6,所以用xy表示的机器人所占四个格子的左上角,因此机器人不能位于n行m列。
2、 判断一个行动是否可行不能只判断起始点,而应该判断整条路径,check_road。
【代码】
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<cmath>
using namespace std; const int maxn = +;
const char* dirs = "NESW"; inline int dir_id(char c) { return strchr(dirs,c)-dirs; } struct Node{
int x,y,dir,d;
}; inline void turn(Node& u,int t) {
if(t==) {u.dir=(u.dir+)%; }
if(t==) {u.dir=(u.dir+)%; }
} int n,m,aim_x,aim_y,f_x,f_y;
char f_dir;
int G[maxn][maxn];
int vis[maxn][maxn][];
queue<Node> q; inline bool inside(int x,int y) { //nm不可达
return x>= && x<n && y>= && y<m && !G[x][y]&&!G[x+][y]&&!G[x+][y+]&&!G[x][y+];
}
inline void if_print(int x,int y,int d) {
if(x==aim_x && y==aim_y) { cout<<d;exit(); }
}
inline bool check_road(int fr_x,int fr_y,int e_x,int e_y) { //检查路径而不能只检查起始点
int dx=e_x-fr_x,dy=e_y-fr_y;
if(dx!=) dx=dx/(abs(dx));if(dy!=) dy=dy/(abs(dy));
int x=fr_x,y=fr_y;
while(x!=e_x || y!=e_y) {
if(!inside(x,y)) return false;
x += dx; y += dy;
}
return inside(x,y);
}
void bfs() {
q.push((Node) {f_x,f_y,dir_id(f_dir),});
vis[f_x][f_y][dir_id(f_dir)]=;
while(!q.empty()) {
Node u=q.front(); q.pop();
int x=u.x,y=u.y,dir=u.dir,d=u.d;
Node u1=u; u1.d++; turn(u1,);
if(!vis[x][y][u1.dir]) { vis[x][y][u1.dir]=; q.push(u1); }
u1=u; u1.d++; turn(u1,);
if(!vis[x][y][u1.dir]) { vis[x][y][u1.dir]=; q.push(u1); } for(int s=;s<=;s++) {
if(dir== && check_road(x,y,x-s,y) &&!vis[x-s][y][dir]) {
vis[x-s][y][dir]=; q.push((Node) {x-s,y,dir,d+}); if_print(x-s,y,d+);
}
if(dir== && check_road(x,y,x,y+s) && !vis[x][y+s][dir]) {
vis[x][y+s][dir]=; q.push((Node) {x,y+s,dir,d+}); if_print(x,y+s,d+);
}
if(dir== && check_road(x,y,x+s,y) && !vis[x+s][y][dir]) {
vis[x+s][y][dir]=; q.push((Node) {x+s,y,dir,d+}); if_print(x+s,y,d+);
}
if(dir== && check_road(x,y,x,y-s) && !vis[x][y-s][dir]) {
vis[x][y-s][dir]=; q.push((Node) {x,y-s,dir,d+}); if_print(x,y-s,d+);
}
}
}
} int main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=n;i++) for(int j=;j<=m;j++) cin>>G[i][j];
cin>>f_x>>f_y>>aim_x>>aim_y>>f_dir; bfs();
cout<<-; return ;
}
洛谷P1126 机器人搬重物的更多相关文章
- 洛谷——P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- 洛谷 P1126 机器人搬重物 (BFS)
题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...
- 洛谷P1126 机器人搬重物【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1126 题意: 给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动. 每一秒钟可以向左转,向右转 ...
- 洛谷P1126机器人搬重物[BFS]
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
- 洛谷 P1126 机器人搬重物
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 $1.6 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 N×MN \times MN×M ...
- 洛谷—— P1126 机器人搬重物
https://www.luogu.org/problem/show?pid=1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机 ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- luogu P1126 机器人搬重物
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
随机推荐
- Python 强大而易用的文件操作(转载)
在Python中可以很方便地做一些诸如浏览目录,创建文件夹,删除文件夹等等的操作. 对文件系统的访问大多通过os模块来实现,因为Python是多平台的,os模块只是前端,具体的实现还是由具体的系统来完 ...
- 【spring配置】 一组配置文件引出的问题
applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> <beans x ...
- linux 弹出光驱失败
[root@NB media]# eject #弹出光驱的命令 umount: /media/____: device is busy. (In some cases useful info abou ...
- Java单实例的最佳写法
前言:代码简洁与性能高效无法两全其美,本文章专注于大并发程序的性能,如果您追求代码简洁,本文章可能不太适合,因为本文章主要讨论如何写出在高并发下也能运行很好的代码. 并文章属于Java并发编程实战中例 ...
- 使用Sass预定义一些常用的样式,非常方便(转)
SS预处理技术现在已经非常成熟,比较流行的有Less,Sass,Stylus,在开发过程中提升我们的工作效率,缩短开发时间,方便管理和维护代码,可以根据自己的喜好选择一款自己喜欢的工具开发,使用很接近 ...
- Struts2的一个问题: 找不到struts.xml的路径问题
一. 最近在学习Struts2的一些知识,在使用Struts2搭建框架的时候,部署到服务器上的时候出现上面的问题: 三月 19, 2016 1:43:24 下午 org.apache.tomcat.u ...
- Seven Python Tools All Data Scientists Should Know How to Use
Seven Python Tools All Data Scientists Should Know How to Use If you’re an aspiring data scientist, ...
- HDU4523+简单
题意很简单. 一次最多多切出一条边! 其余的就没什么好说的了 import java.util.*; import java.math.*; public class Main{ public sta ...
- 网络基本功(八):细说TCP滑动窗口
https://community.emc.com/message/842129#842129
- ThinkPHP3.2.3验证码显示、刷新、校验
显示验证码 首先在Home/Controller下创建一个公共控制器PublicController <?php namespace Home\Controller; use Think\Con ...