洛谷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
洛谷P1126 机器人搬重物【bfs】相关推荐
- CSU-1975 机器人搬重物(BFS)
1975: 机器人搬重物 Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 64 Solved: 10 Description ...
- 洛谷 1144 最短路计数 bfs
洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...
- 机器人搬重物(洛谷-P1126)
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
- 洛谷网 1126机器人搬重物 优先队列搜索 一般
点击打开题目 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可 ...
- 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)
题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...
- 洛谷:P1331 海战(BFS)
题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...
- 洛谷P1332 血色先锋队(BFS多起点)
题目背景 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好 ...
- bfs:01迷宫(洛谷P1141)
洛谷传送门 解析 乍一看:bfs板子题 冰法师最棒了 然鹅 看了一眼数据范围 心中已有画面 <面 堂 发 黑> 怎么办嘞? 我们想到: 因为该题来与去的可逆性 我们搜一次后,这些点以后都不 ...
- 洛谷 P4012 深海机器人问题【费用流】
题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...
最新文章
- ChineseCalendar类[转]
- 面向Agent的系统架构
- python微信库wxpy_使用wxpy这个基于python实现的微信工具库的一些常见问题
- easyui框架前后端交互_Vue+ElementUI+.netcore前后端分离框架开发项目实战
- 汇编语言--标志寄存器
- idea解决maven pom依赖下载失败
- 另类玩法:通过 DNS 进行文件传输
- 事业单位计算机常识PPT,计算机基础知识:PPT常用操作(六)
- (转)在endnote中制作GB/T7714《文后参考文献著录规则》的输出格式
- Java开发社招面试经验:2021最新Java面试笔试
- 手机连接USB通过宽带免费上网
- 设计模式(十一)——树形结构:组合模式
- 不要在意别人的目光,走自己的路
- c语言在内存存储结构,C语言中float,double类型,在内存中的结构(存储方式)
- 名词性短语和名词性从句
- docker安装mosquitto2.0.14问题
- Matlab LZW编码
- [转贴]请珍惜你身边爱你的人
- cad选择集的问题(VBA )
- 软件测试怎么学?如何系统学习软件测试?