洛谷P1126 机器人搬重物【bfs】-程序员宅基地

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

题意:

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

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

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

思路:

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

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

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

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

 

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<map>
  4 #include<set>
  5 #include<iostream>
  6 #include<cstring>
  7 #include<algorithm>
  8 #include<vector>
  9 #include<queue>
 10 
 11 using namespace std;
 12 
 13 int n, m;
 14 int mat[55][55];
 15 //0E, 1S, 2W, 3N
 16 int dx[4][3] = {
    {
    0, 0, 0}, {
    1, 2, 3}, {
    0, 0, 0}, {-1, -2, -3}};
 17 int dy[4][3] = {
    {
    1, 2, 3}, {
    0, 0, 0}, {-1, -2, -3}, {
    0, 0, 0}};
 18 bool vis[55][55][5];
 19 struct node{
 20     int x, y;
 21     int dir;
 22     int t;
 23 }st, ed;
 24 
 25 int getdir(char c)
 26 {
 27     if(c == 'E')return 0;
 28     if(c == 'S')return 1;
 29     if(c == 'W')return 2;
 30     if(c == 'N')return 3;
 31 }
 32 
 33 bool check(int i, int j)
 34 {
 35     return (i >= 1 && i < n && j >= 1 && j < m);
 36 }
 37 
 38 int main()
 39 {
 40     scanf("%d%d", &n, &m);
 41     for(int i = 1; i <= n; i++){
 42         for(int j = 1; j <= m; j++){
 43             scanf("%d", &mat[i][j]);
 44             if(mat[i][j]){
 45                 mat[i - 1][j] = 1;
 46                 mat[i][j - 1] = 1;
 47                 mat[i - 1][j - 1] = 1;
 48             }
 49         }
 50     }
 51     
 52     scanf("%d%d%d%d", &st.x, &st.y, &ed.x, &ed.y);
 53     char dir;
 54     //st.x--;st.y--;ed.x--;ed.y--;
 55     getchar();
 56     scanf("%c", &dir);
 57     st.dir = getdir(dir);
 58     st.t = 0;
 59     
 60     queue<node>que;
 61     que.push(st);
 62     vis[st.x][st.y][st.dir] = true;
 63     int ans = -1;
 64     while(!que.empty()){
 65         node now = que.front();que.pop();
 66         //cout<<endl<<now.x<<" "<<now.y<<" "<<now.t<<endl;
 67         if(now.x == ed.x && now.y == ed.y){
 68             ans = now.t;
 69             break;
 70         }
 71         node to;
 72         to.x = now.x;to.y = now.y;to.t = now.t + 1;
 73         to.dir = (now.dir + 1) % 4;
 74         if(!vis[to.x][to.y][to.dir]){
 75             vis[to.x][to.y][to.dir] = true;
 76             que.push(to);
 77         }
 78         to.dir = (now.dir - 1 + 4) % 4;
 79         if(!vis[to.x][to.y][to.dir]){
 80             vis[to.x][to.y][to.dir] = true;
 81             que.push(to);
 82         }
 83         
 84         to.dir = now.dir;
 85         for(int i = 0; i < 3; i++){
 86             to.x = now.x + dx[to.dir][i];
 87             to.y = now.y + dy[to.dir][i];
 88             if(mat[to.x][to.y])break; 
 89             if(check(to.x, to.y) && !vis[to.x][to.y][to.dir]){
 90                 vis[to.x][to.y][to.dir] = true;
 91                 que.push(to);
 92                 //cout<<to.x<<" "<<to.y<<" "<<to.t<<endl;
 93             }
 94         }
 95     }
 96     
 97     cout<<ans<<endl;
 98         
 99     return 0;
100 }

 

转载于:https://www.cnblogs.com/wyboooo/p/10351545.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30393907/article/details/95614179

智能推荐

caffe-ssd训练自己的数据集(同时记录自己遇到的各种错误)_./build/tools/caffe: not found-程序员宅基地

文章浏览阅读1.4k次。ONE:首先当然是caffe的编译和安装啦,这里不详细阐述,下面内容都是基于caffe-ssd版本来做的。进行下一步之前,确保你的caffe是ssd版本且没有任何问题!TWO:— 准备数据集,jpeg,jpg,png…都可以,反正是你自己的数据集。—创建文件夹,在你的caffe/data/路径下创建一个数据集文件,博主为如下图:然后在imageSets文件夹再新建空文本:test.txt..._./build/tools/caffe: not found

论文笔记 | CT影像结节分割研究进展_肺部影像ct分割研究-程序员宅基地

文章浏览阅读2.3k次,点赞10次,收藏29次。摘 要: 准确分割肺结节在临床上具有重要意义。 计算机断层扫描(computer tomography, CT)技术以其成像速 度快、图像分辨率高等优点广泛应用于肺结节分割及功能评价中。 为了进一步对肺部 CT 影像中的肺结节分割方 法进行探索,本文对基于 CT 影像的肺结节分割方法研究进行综述。 1)对传统的肺结节分割方法及其优缺点进行 了归纳比较;2)重点介绍了包括深度学习、深度学习与传统方法相结合在内的肺结节分割方法;3)简单介绍了肺结 节分割方法的常用评价指标,并结合部分方法的指标表现展望了肺结节._肺部影像ct分割研究

闭包和原型链的继承_闭包,原型,继承-程序员宅基地

文章浏览阅读628次。闭包和原型链的继承>一、闭包1.闭包的概念在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。 function person() { let name = '张嘉文' function job() { console.log(name + '的职业是游戏主播'); } return _闭包,原型,继承

新手蓝桥杯如何训练?(附带题库)-程序员宅基地

文章浏览阅读2.6w次,点赞147次,收藏722次。给大家介绍下蓝桥杯,是近几年可以说国内名气最大的程序设计类比赛了相比国际赛事ACM,蓝桥杯入门简单、中文答题、拿奖率高,更适合国内大众化参加,近几年不少学编程的学生都在参加这个比赛。但也有个不好的地方,就是花销比较高,报名费一次300,另外官方的在线练习系统只开放部分题,不少好的题需要学校花钱开通VIP才可以做。让不少本身就缺乏教学资源的学校不能给学生更好的资源,在起跑线上就输了。但好消息是...

Java进阶(五十七)-基于感知哈希算法的pHash图像配准算法_改进的图像哈希匹配-程序员宅基地

文章浏览阅读4.7w次,点赞12次,收藏37次。毕业论文提交之后,老师交给自己一项任务:图像配准,也就是给你两幅图像,通过系统来判定两幅图像是否为同一副图像。自己作为这一方面的小白,先去网上搜索一下相应的检测方法,当然有现成的API调用最好,花钱也无所谓。我们这里采用的基础关键技术叫做 “感知哈希算法”(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。_改进的图像哈希匹配

Arduino应用开发——spi flash(以esp32和w25qxx为例)_w25q128 esp32-程序员宅基地

文章浏览阅读1.2w次,点赞11次,收藏58次。flash是我们在做嵌入式开发时一定会用到的,因为MCU本身就要使用flash来存储代码,flash的好处是掉电不会丢数据,只是一般MCU本身flash的容量都不大,如果我们需要存储大量的数据,就需要外接flash。flash常用spi接口的,与传感器,电源IC这些芯片不同,不同型号和厂商的flash芯片在通讯协议和内部寄存器这些方面很统一,这对我们开发而言有着很大的好处,这意味着我们的驱动代码可以兼容各种各样的flash,可以在不改代码的基础上直接替换。..._w25q128 esp32

随便推点

IDL学习——处理自带经纬度文件的遥感影像,以哨兵5P数据为例_envi_glt_doit-程序员宅基地

文章浏览阅读2.7k次,点赞7次,收藏31次。@TOC欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增_envi_glt_doit

MySQL date_format()日期格式_date_format可以使用的日期格式-程序员宅基地

文章浏览阅读2k次。DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。DATE_FORMAT(date,format) format参数的格式有%a 缩写星期名%b 缩写月名%c 月,数值%D 带有英文前缀的月中的天%d 月的天,数值(00-31)%e 月的天,数值(0-31)%f 微秒%H 小时 (00-23)%h 小时 (01-12)%I 小时 (01-12)%i 分..._date_format可以使用的日期格式

shell中条件判断if中的-a到-z的意思_shellif -z是什么-程序员宅基地

文章浏览阅读8.7k次。[-a file] 如果file存在则为真 [-b file] 如果file存在且是一个块特殊文件则为真 [-c file] 如果file存在且是一个字特殊文件则为真 [-d file] 如果file文件存在且是一个目录则为真 -d前的!是逻辑非 例如: if [ ! -d $lcd_path/$par_date ] 表示后面的那个目录不存在,则执行后面的then操作 [-e fil_shellif -z是什么

【多子级路由共享父级资源】不同子路由局域网打印机共享、文件共享_子网打印机共享给父网-程序员宅基地

文章浏览阅读2.2k次。要求:能保证每台PC网络的正常使用,不会发生地址的冲突。不添加其他设备。思路:将副路由器的交换机功能打开,关闭DHCP,进而关闭子路由分配和管理IP地址的功能。缺点:丧失子路由的WiFi。实现过程:副路由器LAN口直连主路由器的LAN口,进入副路由管理界面,关闭副路由器的DHCP。将副的当作交换机使用即可。这样子路由仅有交换机功能。..._子网打印机共享给父网

三维数据格式_三维cad的输出格式-程序员宅基地

文章浏览阅读7.3k次,点赞3次,收藏13次。先看一下threejs官网提供的三维模型加载器如见下图stlSTL是CAD软件中出来的一种3D模型文件格式,wiki已经解释的很清楚了。STL文件两种格式,ASCII STL和Binary STL。基本所有的三维软件都支持导出.stl格式三维模型,stl三维模型不包含材质信息,你可以简单地把stl文件理解为几何体对象Geometry,本节课素材box.STL是一个立方体, 用记..._三维cad的输出格式

View桌面agent显示不可用或错误状态_view agent报告此桌面源当前被禁用-程序员宅基地

文章浏览阅读2.7k次。问题概述原因当View连接服务器(cs)无法在VMware View虚拟机上的View Agent建立通信时,就会出现Agent Unreachable状态。另,View桌面在自定义过程中以及在可用并准备使用之前会暂时显示错误状态。当创建配置有Sysprep定制规范的桌面池并且虚拟机模板或父虚拟机包含CustomizationInProgress注册表项时,可能会发生此问题。如果虚拟机以前是由vCenter Server自定义,则此注册表项可以存在,不会影响。通常,在桌面虚拟机上运行的View A_view agent报告此桌面源当前被禁用