博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1126 机器人搬重物
阅读量:6242 次
发布时间:2019-06-22

本文共 4313 字,大约阅读时间需要 14 分钟。

一道又简单又难的BFS题

这道题是个人看上去就知道要BFS。

随手写了个BFS,算样例的答案是7?

翻题解发现:障碍点不能跳过

改过来,终于是12了。交上去,MLE!

显然会有很多状态是重复的,我们可以开一个三维的布尔数组来判重,很傻瓜的操作。

应该改完了,交上去,还有TLE?

哦,我还添加少了vis标记,再慢慢地复制粘贴。

最后的一个错的点居然WA了?

看讨论区的dalao说要先转向再走路,试着改了一下,就对了。。。


这道题给我的提醒:

玩BFS一定要注意判重!

连续的走如果可以一次性完成,但也不能跳过任何的障碍!

代码:

#include
#include
#include
const int maxn = 55;int a[maxn][maxn];bool vis[maxn][maxn][5];struct Nodes{ int x, y; char dir; int dis;};int n, m;int sx, sy, tx, ty;int id(char x){ if(x == 'N') return 1; else if(x == 'S') return 2; else if(x == 'W') return 3; else if(x == 'E') return 4; else return 0;}bool check(int x, int y, int idx){ bool flag1 = (x >= 1 && x < n && y >= 1 && y < m); bool flag2 = (a[x][y] || a[x + 1][y] || a[x][y + 1] || a[x + 1][y + 1]); bool flag3 = vis[x][y][idx]; if(flag1 && !flag2 && !flag3) return true; return false;}int bfs(int sx, int sy, char dir){ std::queue
q; if(!check(sx, sy, id(dir))) return -1; q.push((Nodes){sx, sy, dir, 0}); vis[sx][sy][id(dir)] = true; while(!q.empty()) { Nodes node = q.front(); q.pop(); int x = node.x, y = node.y; char dir = node.dir; int dis = node.dis; if(x == tx && y == ty) { return dis; } if(dir == 'N') { if(!vis[x][y][id('E')]) { q.push((Nodes){x, y, 'E', dis + 1}); vis[x][y][id('E')] = true; } if(!vis[x][y][id('W')]) { q.push((Nodes){x, y, 'W', dis + 1}); vis[x][y][id('W')] = true; } for(int i = 1; i <= 3; i++) { int nx = x - i, ny = y; if(check(nx, ny, id(dir))) { q.push((Nodes){nx, ny, dir, dis + 1}); vis[nx][ny][id(dir)] = true; } else break; } } else if(dir == 'E') { if(!vis[x][y][id('N')]) { q.push((Nodes){x, y, 'N', dis + 1}); vis[x][y][id('N')] = true; } if(!vis[x][y][id('S')]) { q.push((Nodes){x, y, 'S', dis + 1}); vis[x][y][id('S')] = true; } for(int i = 1; i <= 3; i++) { int nx = x, ny = y + i; if(check(nx, ny, id(dir))) { q.push((Nodes){nx, ny, dir, dis + 1}); vis[nx][ny][id(dir)] = true; } else break; } } else if(dir == 'S') { if(!vis[x][y][id('E')]) { q.push((Nodes){x, y, 'E', dis + 1}); vis[x][y][id('E')] = true; } if(!vis[x][y][id('W')]) { q.push((Nodes){x, y, 'W', dis + 1}); vis[x][y][id('W')] = true; } for(int i = 1; i <= 3; i++) { int nx = x + i, ny = y; if(check(nx, ny, id(dir))) { q.push((Nodes){nx, ny, dir, dis + 1}); vis[nx][ny][id(dir)] = true; } else break; } } else if(dir == 'W') { if(!vis[x][y][id('N')]) { q.push((Nodes){x, y, 'N', dis + 1}); vis[x][y][id('N')] = true; } if(!vis[x][y][id('S')]) { q.push((Nodes){x, y, 'S', dis + 1}); vis[x][y][id('S')] = true; } for(int i = 1; i <= 3; i++) { int nx = x, ny = y - i; if(check(nx, ny, id(dir))) { q.push((Nodes){nx, ny, dir, dis + 1}); vis[nx][ny][id(dir)] = true; } else break; } } } return -1;}int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%d", &a[i][j]); char dir; scanf("%d%d%d%d %c", &sx, &sy, &tx, &ty, &dir); printf("%d\n", bfs(sx, sy, dir)); return 0;}

转载于:https://www.cnblogs.com/Garen-Wang/p/9934188.html

你可能感兴趣的文章
复合文字
查看>>
建立TCP连接的三次握手
查看>>
2017年软件工程第四次作业-1代码规范
查看>>
apache与jetty整合,用mod_proxy
查看>>
[转]使用 C++11 编写 Linux 多线程程序
查看>>
[译]Kinect for Windows SDK开发入门(六):骨骼追踪基础 上
查看>>
[译]Kinect for Windows SDK开发入门(八):骨骼追踪进阶 上
查看>>
关于数据库设计--博客系统2
查看>>
AWS 认证攻略(SA)
查看>>
iOS完整学习路线图
查看>>
JAVA_Thread_生产消费模式
查看>>
IceCTF-Matrix
查看>>
java.util.HashSet源码分析
查看>>
yield与yield from
查看>>
两数相加LeetCode
查看>>
c/c++ 获取文件夹或目录下的文件
查看>>
bzoj3316: JC loves Mkk(单调队列+分数规划)
查看>>
P4046 [JSOI2010]快递服务
查看>>
8分钟学会使用AutoMapper
查看>>
使用weka训练一个分类器
查看>>