题目链接:题目链接

题意:一个n*m的区域,每个格子都有上下左右四个门,相邻的两个格子A可以通向B当且仅当A对B的门和B对A的门都打开,问从起点S到终点T需要的最短时间

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1003;
  4. int n,m;
  5. int sx,sy,tx,ty;
  6. int dirx[]={1,-1,0,0};
  7. int diry[]={0,0,1,-1};
  8. char matrix[N][N];
  9. bool visit[N][N][4];
  10. char rotat[6][15]={{"+-|^><vLRUD*"},{"+|->v^<UDRL*"},{"+-|v<>^RLDU*"},{"+|-<^v>DULR*"}};
  11. class node
  12. {
  13. public:
  14. int x;
  15. int y;
  16. int angle;
  17. int step;
  18. public:
  19. node(int x,int y,int a,int s):x(x),y(y),angle(a),step(s){}
  20. };
  21. int number(char c)
  22. {
  23. if(c=='+') return 0;
  24. if(c=='-') return 1;
  25. if(c=='|') return 2;
  26. if(c=='^') return 3;
  27. if(c=='>') return 4;
  28. if(c=='<') return 5;
  29. if(c=='v') return 6;
  30. if(c=='L') return 7;
  31. if(c=='R') return 8;
  32. if(c=='U') return 9;
  33. if(c=='D') return 10;
  34. if(c=='*') return 11;
  35. }
  36. bool yestop(char c)
  37. {
  38. if(c=='+'||c=='|'||c=='^'||c=='L'||c=='R'||c=='D')
  39. return 1;
  40. return 0;
  41. }
  42. bool yesbottom(char c)
  43. {
  44. if(c=='+'||c=='|'||c=='v'||c=='L'||c=='R'||c=='U')
  45. return 1;
  46. return 0;
  47. }
  48. bool yesleft(char c)
  49. {
  50. if(c=='+'||c=='-'||c=='<'||c=='R'||c=='U'||c=='D')
  51. return 1;
  52. return 0;
  53. }
  54. bool yesright(char c)
  55. {
  56. if(c=='+'||c=='-'||c=='>'||c=='L'||c=='U'||c=='D')
  57. return 1;
  58. return 0;
  59. }
  60. bool in(int x,int y)
  61. {
  62. if(x<=0||x>n||y<=0||y>m)
  63. return 0;
  64. return 1;
  65. }
  66. queue<node> Q;
  67. int bfs()
  68. {
  69. Q.push(node(sx,sy,0,0));
  70. visit[sx][sy][0]=1;
  71. while(!Q.empty())
  72. {
  73. node p=Q.front();
  74. Q.pop();
  75. if(p.x==tx&&p.y==ty)
  76. return p.step;
  77. for(int i=0;i<4;i++)
  78. {
  79. int nx=p.x+dirx[i];
  80. int ny=p.y+diry[i];
  81. switch(i)
  82. {
  83. case 0:
  84. if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yesbottom(rotat[p.angle][number(matrix[p.x][p.y])])
  85. &&yestop(rotat[p.angle][number(matrix[nx][ny])]))
  86. {
  87. Q.push(node(nx,ny,p.angle,p.step+1));
  88. visit[nx][ny][p.angle]=1;
  89. }
  90. break;
  91. case 1:
  92. if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yestop(rotat[p.angle][number(matrix[p.x][p.y])])
  93. &&yesbottom(rotat[p.angle][number(matrix[nx][ny])]))
  94. {
  95. Q.push(node(nx,ny,p.angle,p.step+1));
  96. visit[nx][ny][p.angle]=1;
  97. }
  98. break;
  99. case 2:
  100. if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yesright(rotat[p.angle][number(matrix[p.x][p.y])])
  101. &&yesleft(rotat[p.angle][number(matrix[nx][ny])]))
  102. {
  103. Q.push(node(nx,ny,p.angle,p.step+1));
  104. visit[nx][ny][p.angle]=1;
  105. }
  106. break;
  107. case 3:
  108. if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yesleft(rotat[p.angle][number(matrix[p.x][p.y])])
  109. &&yesright(rotat[p.angle][number(matrix[nx][ny])]))
  110. {
  111. Q.push(node(nx,ny,p.angle,p.step+1));
  112. visit[nx][ny][p.angle]=1;
  113. }
  114. break;
  115. }
  116. }
  117. p.angle=(p.angle+1)%4;
  118. if(!visit[p.x][p.y][p.angle])
  119. {
  120. p.step++;
  121. Q.push(node(p));
  122. visit[p.x][p.y][p.angle]=1;
  123. }
  124. }
  125. return -1;
  126. }
  127. int main()
  128. {
  129. scanf("%d%d",&n,&m);
  130. for(int i=1;i<=n;i++)
  131. scanf("%s",matrix[i]+1);
  132. scanf("%d%d",&sx,&sy);
  133. scanf("%d%d",&tx,&ty);
  134. printf("%d\n",bfs());
  135. }

codeforces #Round354-div2-D(BFS)的更多相关文章

  1. CodeForces 540C Ice Cave (BFS)

    http://codeforces.com/problemset/problem/540/C       Ice Cave Time Limit:2000MS     Memory Limit:262 ...

  2. Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)

    题意:过年了,Bob要抢红包.抢红包的时间段为1 - n,有m个红包,每个红包有三个属性:st(红包出现的时间), ed(红包消失的时间),d(如果抢了这个红包,能够抢下一个红包的时间),w(红包的收 ...

  3. codeforces 1283D. Christmas Trees(bfs)

    链接: https://codeforces.com/contest/1283/problem/D 题意:给定n个不同的整数点,让你找m个不同的整数点,使得这m个点到到这n个点最小距离之和最小. 思路 ...

  4. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  5. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  6. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  7. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  8. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  9. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  10. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

随机推荐

  1. PHP 高并发、抢票、秒杀 解决方案

    对于抢票.秒杀这种业务,我说说自己对这种高并发的理解吧,这里提出个人认为比较可行的几个方案:方案一:使用队列来实现可以基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧比如有100张 ...

  2. JavaScript学习——判断数据类型总结(转)

    一.JS中的数据类型 1.数值型(Number):包括整数.浮点数. 2.布尔型(Boolean) 3.字符串型(String) 4.对象(Object) 5.数组(Array) 6.空值(Null) ...

  3. Android SDK的安装以及环境变量的配置

    想来试试app的开发,于是便需要在电脑上安装各种软件包,其中Android SDK就是其中一种,特地记录一下其安装过程: 1.下载地址http://baoku.360.cn/soft/show/app ...

  4. Snappy压缩

    Snappy压缩时,碰到不能解压问题,所用服务器Tomcat8.经验证,降低Tomcat版本为7,才可正常解压文件. 若碰到偶尔不能解压的问题,试着换个浏览器试试.

  5. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  6. ANGULARJS 动态编译添加到dom中

    在使用angularjs 时,希望通过动态构建angular模版,再通过angular进行展示. 使用 方法如下: <html ng-app="app"> <he ...

  7. .net调用存储过程碰到的一个问题

    问题描述 报错信息如下: Execution of user code in the .NET Framework is disabled. Enable "clr enabled" ...

  8. java四大名著

    java编程思想effective Javajava核心技术java编程语言 外加:  深入理解java虚拟机 自己动手写java虚拟机 java并发编程的艺术 java常用算法手册 其他计算机需要看 ...

  9. 二模 (6) day2

    第一题: 题目大意:50*50的格子里玩贪吃蛇.给出N步扭头的操作,判断贪吃蛇会在第几步挂掉.(蛇初始向东) 解题过程: 1.一开始的方法是:为了加快速度,只保存头和尾的坐标,然后保存尾巴的方向,每次 ...

  10. placeholder在IE8中兼容性问题解决

    placeholder是HTML5中的一个属性,可以在文本框中设置placeholder属性来显示一些提示性的文字,但对IE10以下的浏览器不支持,下面方法可以让placeholder能够使用在IE1 ...