题目链接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. HTML解析库Gumbo简单使用记录

    目录 Gumbo简介 使用记录 1.GumboNode的类型 2.简单的使用 Gumbo简介 Gumbo是谷歌开源的一个纯C编写的HTML解析库,性能很好,就是用起来比较麻烦. github地址htt ...

  2. 【strpos】php的strpos的坑,记一次

    php > var_dump(strpos('开始23测试ceshi', '测试')); int(8) php > var_dump(mb_strpos('开始23测试ceshi', '测 ...

  3. 【Android】解析Paint类中MaskFilter的使用

    目录结构: contents structure [+] EmbossMaskFilter BlurMaskFilter MaskFilter可以用来指定画笔的边缘效果.如果引用开启硬件加速的话,那么 ...

  4. Spring Boot系列——Spring Boot如何启动

    Spring Boot启动过程 ​上篇<Spring Boot系列--5分钟构建一个应用>介绍了如何快速创建一个Spring Boot项目并运行.虽然步骤少流程简单,为开发者省去了很多重复 ...

  5. 揭开Docker的神秘面纱

    Docker 相信在飞速发展的今天已经越来越火,它已成为如今各大企业都争相使用的技术.那么Docker 是什么呢?为什么这么多人开始使用Docker? 本节课我们将一起解开Docker的神秘面纱. 本 ...

  6. Spring Boot 2.0 热部署指南

    Spring Boot 2.0 支持热部署,实现方法很简单 Spring Boot 2.0 有几种热重载的选项. 推荐的方法是使用spring-boot-devtools 因为它提供了额外的开发时间功 ...

  7. linux每日命令(31):tar命令

    tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现在,用户可以在 ...

  8. YouTube上最火的十个大数据视频

    http://blog.jobbole.com/84148/ YouTube上最火的十个大数据视频

  9. rqalpha探究 1 setup.py

    rqalpha是难得几个好的做量化交易的开源项目,不过由于自己python用的实在不多,看起来还是觉得很复杂. 因此准备抽取出框架,从最简单的搭建. 思路 从setup着手,看一下如何建立一个发布工程 ...

  10. [Python] 00 - Books

    A.I. & Optimization Advanced Machine Learning, Data Mining, and Online Advertising Services Ref: ...