这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而Helen达到(1,2),这种情况也算是相遇。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int _move[][] = {{-, }, {, }, {, -}, {, }};
  4. int visit[][][][];
  5. int Helen_move[];
  6. int n,m;
  7. char _map[][];
  8. struct Node{
  9. int x1, y1;//Paris
  10. int x2, y2;//Helen
  11. int step;
  12. };
  13.  
  14. Node bfs(int x1, int y1, int x2, int y2, int n, int m){
  15. Node front;
  16. front.x1 = x1;
  17. front.y1 = y1;
  18. front.x2 = x2;
  19. front.y2 = y2;
  20. front.step = ;
  21. queue<Node> q;
  22. q.push(front);
  23. visit[x1][y1][x2][y2] = ;
  24. while(!q.empty()){
  25. front = q.front(); q.pop();
  26. if(front.step > ) {
  27. return front;//若大于255,则返回
  28. }
  29. for(int i = ; i < ; i++){
  30. int Paris_x = front.x1 + _move[i][];//走一步
  31. int Paris_y = front.y1 + _move[i][];
  32. if( <= Paris_x && Paris_x < n && <= Paris_y && Paris_y < m &&
  33. _map[Paris_x][Paris_y] != '#' && _map[Paris_x][Paris_y] != '!'){
  34. int k = Helen_move[i];
  35.  
  36. int Helen_x = front.x2 + _move[k][];
  37. int Helen_y = front.y2 + _move[k][];
  38.  
  39. if( <= Helen_x && Helen_x < n && <= Helen_y && Helen_y < m){
  40. if(_map[Helen_x][Helen_y] == '#'){//撞墙则不走
  41. Helen_x = front.x2;
  42. Helen_y = front.y2;
  43. }
  44. else if(_map[Helen_x][Helen_y] == '!') continue;//遇到熔浆
  45.  
  46. if(visit[Paris_x][Paris_y][Helen_x][Helen_y] == ) continue;
  47. Node tmp = front;
  48. tmp.x1 = Paris_x;
  49. tmp.y1 = Paris_y;
  50. tmp.x2 = Helen_x;
  51. tmp.y2 = Helen_y;
  52. tmp.path[tmp.step] = i;
  53. tmp.step = front.step + ;
  54. q.push(tmp);
  55. visit[Paris_x][Paris_y][Helen_x][Helen_y] = ;
  56. if(Paris_x == Helen_x && Paris_y == Helen_y){//直接相遇
  57. return tmp;
  58. }
  59. if(Paris_x == front.x2 && Paris_y == front.y2 &&
  60. Helen_x == front.x1 && Helen_y == front.y1){
  61. return tmp;//交差相遇
  62. }
  63. }
  64.  
  65. }
  66. }
  67. }
  68. front.step = ;
  69. return front;
  70. }
  71. int main(){
  72. cin >> n >> m;
  73.  
  74. int x1, y1;
  75. int x2, y2;
  76. memset(visit, , sizeof(visit));
  77. memset(Helen_move, , sizeof(Helen_move));
  78. for(int i = ; i < n; i++){
  79. for(int j = ; j < m; j++){
  80. cin >> _map[i][j];
  81. if(_map[i][j] == 'P'){//Paris的位置
  82. x1 = i;
  83. y1 = j;
  84. }
  85. if(_map[i][j] == 'H'){//Helen的位置
  86. x2 = i;
  87. y2 = j;
  88. }
  89. }
  90. }
  91.  
  92. for(int i = ; i < ; i++){
  93. char c;
  94. cin >> c;
  95. if(c == 'N')Helen_move[i] = ;//Paris走时Helen的方向
  96. else if(c == 'S')Helen_move[i] = ;
  97. else if(c == 'W')Helen_move[i] = ;
  98. else if(c == 'E')Helen_move[i] = ;
  99. }
  100. Node tmp = bfs(x1, y1, x2, y2, n, m);
  101. if(tmp.step > ) cout << "Impossible" << endl;
  102. else{
  103. cout << tmp.step << endl;
  104. }
  105.  
  106. }
  107.  
  108. /*
  109. 5 5
  110. #####
  111. #P#.#
  112. #H!.#
  113. #.#.#
  114. #####
  115. WNSE
  116. */

Sicily 1215: 脱离地牢(BFS)的更多相关文章

  1. sicily 1215. 脱离地牢

    Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想得到这两块石头了,只要把 ...

  2. 20180610模拟赛T1——脱离地牢

    Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要 ...

  3. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

  4. sicily 题目分类

    为了方便刷题,直接把分类保存下来方便来找. 转自:http://dengbaoleng.iteye.com/blog/1505083 [数据结构/图论] 1310Right-HeavyTree笛卡尔树 ...

  5. 地牢逃脱 (BFS)

    题意:给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指 ...

  6. 2019 校内赛 RPG的地牢猎手(bfs+优先队列)

    Problem Description Luke最近沉迷一款RPG游戏,游戏中角色可以进入地牢关卡,只要顺利走出地牢就可以获得奖励.地牢表示为n行m列的块矩阵,其中每个块只可以是障碍块.入口.出口或数 ...

  7. BFS简单题套路_Codevs 1215 迷宫

    BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 ; struct Status { int r, c; Status(, ) : r(r), c(c) {} // ...

  8. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

  9. Sicily 1051: 魔板(BFS+排重)

    相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...

随机推荐

  1. PAT 1047. 编程团体赛(20)

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

  2. struts2中值栈

    值栈中的两个逻辑部分: 1.属性context,为OGNLContext类型,实际为ActionContext对象的一个引用,本质是一个Map,里面存放的各种Map,如request,session, ...

  3. VS调试经常打断点打上之后没反应的问题

    在调试的时候经常会发现打了断点但是始终不进到程序中来,这是因为访问的这个页面在服务器中有缓存,也就是在iis中产生了缓存.访问的时候直接进到读取的缓存文件, 根本没有读取项目文件,所以打了断点肯定进不 ...

  4. SQLAlchemy(一)

    说明 SQLAlchemy只是一个翻译的过程,我们通过类来操作数据库,他会将我们的对应数据转换成SQL语句. 运用ORM创建表 #!/usr/bin/env python #! -*- coding: ...

  5. crodova打包apk个人总结

    1.安装nodejs 2.安装 cordova npm install -g cordova 3.安装Java JDK,官网下载地址 系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安 ...

  6. Mac OSX:Powerline风格的zsh配置

    需要的工具 iTerm,一个替代OSX自带终端的软件,基于iTerm才能实现上面的效果: oh-my-zsh,zsh是OSX上最强大的shell,没有之一,但是配置过程较为复杂,这个脚本能够帮你一键配 ...

  7. 12,13 Proxy和Reflect

    Proxy和Reflect Proxy(代理) Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种"元编程"(meta programming),即对编程 ...

  8. 大神php摘录

    1. $rs = M('order')->where('id='.$res['id'])->save($order); )){ M('member')->where('id='.$m ...

  9. diff生成补丁与patch打补丁

    1.使用diff生成补丁: diff是Linux下的文件比较命令,参数这里就不说了,直接man一下就行了,不仅可以比较文件,也可以比较两个目录,并且可以将不同之处生成补丁文件,其实就是一种打补丁的命令 ...

  10. 利用JS判断是否手机或pad访问

    <script type="text/javascript"> /* * 智能机浏览器版本信息: * */ var browser={ versions:functio ...