题目链接https://www.luogu.org/problemnew/show/P1126

题意:

给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动。

每一秒钟可以向左转,向右转或者直走1步2步或是3步。

现在给定一个起点和开始的朝向,问走到终点至少要多少时间。

思路:

真是一道狗屎坑题。题目给出的是格点,而机器人是在交点上运动的。

盗用一下洛谷@雒仁韬的图。题目给出的障碍物其实是橙色的四个点中的右下角的这个。

而且由于球的直径,最外围边界并不能走到。如果正确理解了题意的话应该就没问题了。

由于有方向,所以用三维数组来存某点是否被访问。

 #include<stdio.h>
#include<stdlib.h>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue> using namespace std; int n, m;
int mat[][];
//0E, 1S, 2W, 3N
int dx[][] = {{, , }, {, , }, {, , }, {-, -, -}};
int dy[][] = {{, , }, {, , }, {-, -, -}, {, , }};
bool vis[][][];
struct node{
int x, y;
int dir;
int t;
}st, ed; int getdir(char c)
{
if(c == 'E')return ;
if(c == 'S')return ;
if(c == 'W')return ;
if(c == 'N')return ;
} bool check(int i, int j)
{
return (i >= && i < n && j >= && j < m);
} int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
scanf("%d", &mat[i][j]);
if(mat[i][j]){
mat[i - ][j] = ;
mat[i][j - ] = ;
mat[i - ][j - ] = ;
}
}
} scanf("%d%d%d%d", &st.x, &st.y, &ed.x, &ed.y);
char dir;
//st.x--;st.y--;ed.x--;ed.y--;
getchar();
scanf("%c", &dir);
st.dir = getdir(dir);
st.t = ; queue<node>que;
que.push(st);
vis[st.x][st.y][st.dir] = true;
int ans = -;
while(!que.empty()){
node now = que.front();que.pop();
//cout<<endl<<now.x<<" "<<now.y<<" "<<now.t<<endl;
if(now.x == ed.x && now.y == ed.y){
ans = now.t;
break;
}
node to;
to.x = now.x;to.y = now.y;to.t = now.t + ;
to.dir = (now.dir + ) % ;
if(!vis[to.x][to.y][to.dir]){
vis[to.x][to.y][to.dir] = true;
que.push(to);
}
to.dir = (now.dir - + ) % ;
if(!vis[to.x][to.y][to.dir]){
vis[to.x][to.y][to.dir] = true;
que.push(to);
} to.dir = now.dir;
for(int i = ; i < ; i++){
to.x = now.x + dx[to.dir][i];
to.y = now.y + dy[to.dir][i];
if(mat[to.x][to.y])break;
if(check(to.x, to.y) && !vis[to.x][to.y][to.dir]){
vis[to.x][to.y][to.dir] = true;
que.push(to);
//cout<<to.x<<" "<<to.y<<" "<<to.t<<endl;
}
}
} cout<<ans<<endl; return ;
}

洛谷P1126 机器人搬重物【bfs】的更多相关文章

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

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

  2. 洛谷P1126 机器人搬重物

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

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

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

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

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

  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. 转发:查看centos中的用户和用户组

    1.用户列表文件:/etc/passwd/ 2.用户组列表文件:/etc/group 3.查看系统中有哪些用户: cut -d : -f 1 /etc/passwd 4.查看可以登录系统的用户: ca ...

  2. 鼠标滑过GridView的数据行时修改行的背景颜色

    基本原理可以参考另一篇文章:鼠标滑过table时修改表格行的背景颜色 下面是针对GridView实现该效果的代码:就是编写GridView控件的RowDataBound事件的代码. protected ...

  3. Photodesk for Mac(Instagram 桌面客户端)破解版安装

    1.软件简介    PhotoDesk - for Instagram 是 macOS 系统上一款 Instagram 客户端,可以让大家在 Mac 上观看朋友的新照片.或是最近热门的作品,也可以 f ...

  4. C#中回滚TransactionScope的使用方法和原理

    TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成   实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事 ...

  5. linux下无法执行PHP命令,错误 php: command not found

    在linux下执行php时无法执行,报错:php: command not found 解决方法: export PATH=$PATH:/usr/local/php7/bin 可以输入echo $PA ...

  6. [k8s]一些技巧性的yaml和dockerfile-docker学习思路

    我会把一些dockerfile和yaml的技巧性东西不定期搜集到这里 docker学习思路 三部曲: 1,vm会搭建服务 2,docker会跑服务 3,k8s集群会调度该服务 存储 vm1 vm2 共 ...

  7. ThreadPoolExecutor 线程池浅析

    作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它. 下面我们就通过源码来一步一步弄清楚它. 内部状态 线程有五种状态:新 ...

  8. Ramda函数式编程之PHP

    0x00 何为函数式编程 网上已经有好多详细的接受了,我认为比较重要的有: 函数是"第一等公民",即函数和其它数据类型一样处于平等地位 使用"表达式"(指一个单 ...

  9. 自定义progressdialog,改善用户体验

    自定义progressdialog,改善用户体验

  10. Java知多少(3) 就业方向

    Java的就业前景如何,看培训班就知道了,以Java培训为主的达内,已经上市. 根据IDC的统计,在所有软件开发类人才的需求中,对JAVA工程师的需求曾达到全部需求量的50%以上.而且,JAVA工程师 ...