题目链接: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

洛谷P1126 机器人搬重物【bfs】相关推荐

  1. CSU-1975 机器人搬重物(BFS)

    1975: 机器人搬重物 Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 64     Solved: 10 Description ...

  2. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  3. 机器人搬重物(洛谷-P1126)

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

  4. 洛谷网 1126机器人搬重物 优先队列搜索 一般

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

  5. 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)

    题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...

  6. 洛谷:P1331 海战(BFS)

    题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...

  7. 洛谷P1332 血色先锋队(BFS多起点)

    题目背景 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好 ...

  8. bfs:01迷宫(洛谷P1141)

    洛谷传送门 解析 乍一看:bfs板子题 冰法师最棒了 然鹅 看了一眼数据范围 心中已有画面 <面 堂 发 黑> 怎么办嘞? 我们想到: 因为该题来与去的可逆性 我们搜一次后,这些点以后都不 ...

  9. 洛谷 P4012 深海机器人问题【费用流】

    题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...

最新文章

  1. ChineseCalendar类[转]
  2. 面向Agent的系统架构
  3. python微信库wxpy_使用wxpy这个基于python实现的微信工具库的一些常见问题
  4. easyui框架前后端交互_Vue+ElementUI+.netcore前后端分离框架开发项目实战
  5. 汇编语言--标志寄存器
  6. idea解决maven pom依赖下载失败
  7. 另类玩法:通过 DNS 进行文件传输
  8. 事业单位计算机常识PPT,计算机基础知识:PPT常用操作(六)
  9. (转)在endnote中制作GB/T7714《文后参考文献著录规则》的输出格式
  10. Java开发社招面试经验:2021最新Java面试笔试
  11. 手机连接USB通过宽带免费上网
  12. 设计模式(十一)——树形结构:组合模式
  13. 不要在意别人的目光,走自己的路
  14. c语言在内存存储结构,C语言中float,double类型,在内存中的结构(存储方式)
  15. 名词性短语和名词性从句
  16. docker安装mosquitto2.0.14问题
  17. Matlab LZW编码
  18. [转贴]请珍惜你身边爱你的人
  19. cad选择集的问题(VBA )
  20. 软件测试怎么学?如何系统学习软件测试?

热门文章

  1. stm32-再谈GPIO
  2. Centos 安装 Chrome
  3. 2016年百度面试题
  4. 汇编语言-子程序调用
  5. Gridview导出到EXCEL
  6. 两篇讲述Skinned Mesh原理的文章
  7. no target device found怎么解决_Linux 使用Unzip提示write error (disk full?)的解决方法
  8. 用php mui ajax注册登录页面,ajax实现简单登录页面
  9. 基于FPGA实现ADC7768数据采集系统设计(8路)
  10. (79)FPGA版本如何管理?