洛谷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的网格,有些格子为不可移动的障碍.机 ...
随机推荐
- PHP学习笔记(5) - 选择一个合格的框架
作为一个合格的PHP开发框架,个人觉得起码需要满足以下几点. 一.上梁不正下梁歪,好的框架首先自身要有良好的编码规范和文件目录结构,代码要易于阅读理解. 二.为了可以更好地适应OOP,框架必须可以提供 ...
- PYTHON代码摘录
文件处理 #典型的读取文件代码 row_data = {} with open('PaceData.csv') as paces: column_heading = paces.readline(). ...
- hdu 5652 India and China Origins 并查集+逆序
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意:一张n*m个格子的点,0表示可走,1表示堵塞.每个节点都是四方向走.开始输入初始状态方格, ...
- use worker without js file
var blob = new Blob(['onmessage=function(e){postMessage(e.data);}']); debugger; // Obtain a blob URL ...
- 学无止境,学习AJAX(二)
POST 请求 一个简单 POST 请求: xmlhttp.open("POST","demo_post.asp",true); xmlhttp.send(); ...
- centos 下 yum 安装 nginx 平滑切换安装到 Tengine
---恢复内容开始--- 据说淘宝的Tengine很牛X,所以我们今天也来玩玩,我们这里是某开放云的vps,现在已经安装好了nginx,现在我们要平滑切换到安装Tengine. 下载Tengine,解 ...
- XSS高级实战教程
1.[yueyan科普系列]XSS跨站脚本攻击--yueyan 2.存储型XSS的成因及挖掘方法--pkav 3.跨站脚本攻击实例解析--泉哥 4.XSS高级实战教程--心伤的瘦子 5.XSS利用与挖 ...
- MAC下《暗黑世界》客户端版本编译说明!!
原地址:http://blog.csdn.net/uxqclm/article/details/11970659 2013-09-24 12:02 161人阅读 评论(0) 收藏 举报 目录(?) ...
- Twisted 阐述
原地址:http://bbs.gameres.com/thread_224020.html Firefly为什么使用Twisted?1.基于PythonTwisted是使用Python编写的,强壮的. ...
- VCL+FMX 双剑合壁编程
VCL 是经典,FMX 是新生,新生事物总会带来一些好玩新奇的东西.舍弃经典是浪费,不了解新生事物是等死,那么我们来一个二合一双剑合壁又如何呢? 要双剑合壁,就得投些机,取些巧.由于 Delphi / ...