洛谷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 机器人搬重物的更多相关文章

  1. 洛谷——P1126 机器人搬重物

    P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...

  2. 洛谷 P1126 机器人搬重物 (BFS)

    题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...

  3. 洛谷P1126 机器人搬重物【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1126 题意: 给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动. 每一秒钟可以向左转,向右转 ...

  4. 洛谷P1126机器人搬重物[BFS]

    题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...

  5. 洛谷 P1126 机器人搬重物

    题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 $1.6 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 N×MN \times MN×M ...

  6. 洛谷—— P1126 机器人搬重物

    https://www.luogu.org/problem/show?pid=1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机 ...

  7. luogu P1126 机器人搬重物 题解

    luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...

  8. P1126 机器人搬重物

    P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...

  9. luogu P1126 机器人搬重物

    题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...

随机推荐

  1. 可以自动安装mysql数据库的一个shell脚本

    发布:thatboy   来源:脚本学堂     [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...

  2. mysql 远程连接 2003 Can't connect to MySQL server (10060)

    mysql server 端的端口被防火墙挡出,没有开放

  3. hdu 1568 Fibonacci 数学公式

    Fibonacci Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到的Fibonacci数列(f[0]=0,f[1]=1;f[i] = ...

  4. swift版本hello

    import UIKit class ViewController: UIViewController { @IBOutlet var button : UIButton? //var alertVi ...

  5. Unity3D研究院之在MAC上脚本XlsxWriter写入Excel .xlsx格式

    原地址:http://www.xuanyusong.com/archives/3011 以前找了很久可以跨平台支持读写Excel的工具,我也试了很多种DLL.可在Windows上各个完美支持,可是在M ...

  6. 李洪强iOS开发本人集成环信的经验总结_02_基本配置

     李洪强iOS开发本人集成环信的经验总结_02_基本配置 来到APPdelegate中做一些配置 01 - 导入头文件 02 - 在didFinishLaunchingWithOptions用法总结 ...

  7. Altium快捷键

    M快捷键 PCB快捷键 编辑 视图

  8. QT4项目升级到QT5遇到的问题和解决方法

    QT4升级到QT5改动: PC部分: [改QTDIR变量] 在工程根目录下找到.user文件, 如InnoTabPlugin.vcxproj.user 修改指向你的QT5根目录: <Proper ...

  9. 存储过程系列之存储过程具体操作过程及sql数据库调用

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. 存 ...

  10. BZOJ_3527_[ZJOI2014]_力_(FFT+卷积)

    描述 题面: http://wenku.baidu.com/link?url=D2ORnA9xjgSxa2GlYLB7gGiYgBcXsy-Aw0kVYTjTE-iYhH1s7h8xXGmnaMwl3 ...