洛谷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的网格,有些格子为不可移动的障碍.机 ...
随机推荐
- RepeatedDNASequences BestTime_to_Buy_and_SellStockIV
/** * @Author: weblee * @Email: likaiweb@163.com * @Blog: http://www.cnblogs.com/lkzf/ * @Time: 2015 ...
- Linux-ubuntu
在VMware安装ubuntu时磁盘分配如下: /boot 100MB / 2G swap 512MB /home 5G /var 1G /usr 5G+. 设置root权限:sudo passwd ...
- C# Windows Service调用IBM Lotus Notes发送邮件
近日研究了下IBM Lotus Mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习Lotus Mail,想做成Windows服务,提供wcf ...
- unity3d 使用背景贴图
使用贴图代替天空盒作为背景,参照:http://www.narkii.com/club/thread-261840-1.html 看看我做的:
- CODEVS 1069关押罪犯
题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 ...
- <一> MVC - HtmlHelper
HtmlHelper类位于System.Web.Mvc.Html之中主要有七个静态类组成: FormExtensions - BeginForm, BeginRouteForm, EndForm In ...
- <三> SQL杂七杂八
批量插入测试数据 use Testdeclare @count INTset @count = 0while(@count < 10)begin waitfor delay '000:00:10 ...
- Html之img标签
我发现了为什么我不会开发,或者不愿意,我感觉是因为我不会前端,自认为写出来完美的后台显示不好也没人用,为了解决这一问题,笔者新增html栏目,和大家一起交流分享. 一.img必须有src和alt属性 ...
- asp.net推送
http://tech.it168.com/a2012/0210/1310/000001310252_all.shtml http://www.infoq.com/cn/news/2012/09/rc ...
- DHTMLX 前端框架 建立你的一个应用程序 教程(八)-- 添加表单Form
添加表单Form 我们下一步是在页面中添加一个表单,表格中的选中字段将会显示在表单中.提供一个提交按钮 可以对显示的数据进行修改提交. 添加表单到布局单元格中 1.在右侧布局中使用attachForm ...