题意:一自行车的轮子被分成5个扇区,涂了5种不同颜色。自行车每1秒要么骑到下一个格子,要么左转或者右转90。一开始自行车面向北,颜色为绿,到达目标格时,必须触底颜色为绿,但朝向无限制。求到达目标格的最短时间。

思路:可以朝3个方向搜索,多了一种颜色状态,每个结点有四个值需要保存,坐标x,坐标y,朝向,底面颜色。每个结点只可以执行一次,不然会出现死循环。所以需要vis数组标记。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
const int maxn = 30;struct node
{int x,y,s,c,dis;//x,y是坐标 s是方向 c是颜色 dis是距离node(int x = 0,int y = 0,int s = 0,int c = 0,int dis = 0):x(x),y(y),s(s),c(c),dis(dis){}bool operator < (const node &a) const{return a.dis < dis;}
};
char map[maxn][maxn];
int vis[maxn][maxn][4][5];
int n,m;
int d[4][2] = {-1,0,0,1,1,0,0,-1};std::priority_queue<node> q;int BFS(int sx,int sy,int ex,int ey)
{q.push(node(sx,sy,0,0,0));vis[sx][sy][0][0];node pp;while(!q.empty()){pp =q.top(); q.pop();if(pp.x == ex && pp.y == ey && pp.c == 0){return pp.dis;}for(int i=0;i<4;i++){int dx = pp.x + d[i][0];int dy = pp.y + d[i][1];int dis = pp.dis+1;int c = (pp.c+1)%5;if(i == pp.s){if(dx >= n || dx < 0 || dy < 0 || dy >= m)continue;if(map[dx][dy] == '#' || vis[dx][dy][pp.s][c]) continue;q.push(node(dx,dy,i,c,dis));vis[dx][dy][pp.s][c] = 1;}else{if((pp.s+1)%4 == i || (pp.s-1+4)%4 == i){if(vis[pp.x][pp.y][i][pp.c])continue;vis[pp.x][pp.y][i][pp.c] = 1;q.push(node(pp.x,pp.y,i,pp.c,dis));}}}}return -1;
}
int main()
{int i,j;int sx,sy,ex,ey;int cas = 1;while(scanf("%d%d",&n,&m),n+m){while(!q.empty())q.pop();memset(vis,0,sizeof(vis));for(i=0;i<n;i++){scanf("%s",map[i]);for(j=0;j<m;j++){if(map[i][j] == 'S')sx = i, sy = j;if(map[i][j] == 'T')ex = i, ey = j;}}if(cas > 1) printf("\n");printf("Case #%d\n",cas++);int ans = BFS(sx,sy,ex,ey);if(ans == -1) printf("destination not reachable\n");else printf("minimum time = %d sec\n",ans);}return 0;
}/*1 3
S#T
10 10
#S.......#
#..#.##.##
#.##.##.##
.#....##.#
##.##..#.#
#..#.##...
#......##.
..##.##...
#.###...#.
#.....###T
0 0*/

转载于:https://www.cnblogs.com/BruceNoOne/p/3854313.html

UVa10047 BFS相关推荐

  1. UVA-10047 The Monocycle (图的BFS遍历)

    题目大意:一张图,问从起点到终点的最短时间是多少.方向转动也消耗时间. 题目分析:图的广度优先遍历... 代码如下: # include<iostream> # include<cs ...

  2. HDU-1459.非常可乐(BFS )

    这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...

  3. HDU1548:A strange lift(Dijkstra或BFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...

  4. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  5. usaco Overfencing 穿越栅栏(BFS)

    Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...

  6. 数据结构--搜索BFS

    文章目录 广度优先搜索 典型例题 广度优先搜索 广度优先搜索类似于树的层次遍历过程.它需要借助一个队列来实现.如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1.v2. ...

  7. 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝

    题意:给一个长度为n的字符串数组,你可以选定起点跳n次,从i点只能跳到(i*i+1)%n的位置,最后求一个最大字典序. 思路:要求最大的,即每一步都是最大,所以将最大的数都入队进行bfs跳下一步. 剪 ...

  8. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

  9. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

最新文章

  1. 神经网络通过研究任意单个星系,揭示整个宇宙的组成
  2. python编程入门与案例详解pdf-Python入门之三角函数sin()函数实例详解
  3. leetcode day5 -- Reorder List Linked List Cycle II
  4. Oracle左右链接
  5. js贪心算法---背包问题
  6. Bootstrap 3 与 Foundation 5 的区别
  7. Eureka覆盖状态
  8. ServiceMash服务网格--理解lstio/envoy
  9. 网管世界 网管生活 网管总结
  10. html鼠标自动向下滑动,win10电脑中鼠标自动向下或向上滚动怎么解决
  11. dp线长什么样子_一根DP线引发的显示器超频事件
  12. 读《创业36条军规》(四)创业是最好的武器
  13. 第十三届蓝桥杯模拟赛第二期JAVA组个人题解
  14. python语言程序设计习题
  15. 两种取汉字拼音首字母的方法.--函数为转抄而来.
  16. 【UML 建模】在线UML建模工具 ProcessOn 使用具体解释
  17. 华为nova2s用哪个型号服务器,华为nova 2s
  18. web前端面试合集2022版
  19. 批处理常用特殊符号简介
  20. 你知道吸引新客选择产品的角度从哪些方面考虑吗?产品研发后怎么评估呢?

热门文章

  1. vb.net 模拟鼠标 失去焦点_孢子:EA最成功的神作,虽能“模拟万物”但却落得昙花一现...
  2. 31岁了学python还是arm_学嵌入式的,学完了51单片机,下一步呢,是学stm32还是学arm呢.有些迷茫还有Linux等。怎么一步步学好...
  3. php无法查询excel数据,laravel phpexcel无法读取excel中中文表头列数据
  4. 19生成材料清单_爷青没!SU不止能建模,物料清单也能做
  5. 左右边界二分查找小总结
  6. 人脸验证(五)--NormFace
  7. 孙鑫-MFC笔记三--绘图
  8. 嵌入式系统——软件测试工程
  9. 磁盘块与扇区的区别和联系
  10. Kicad如何导入封装库、符号库(元件库)以及3D模型文件?