链接:http://www.lightoj.com/volume_showproblem.php?problem=1055

类似推箱子的游戏,一条命令可以让abc三个小人同时移动,但是出界或者撞墙是不移动的,求abc到达终点x所需要的最小步数。

我这里用六维的vis来标记这个点走过没,直接上代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. char mp[][];
  5. bool vis[][][][][][];
  6. struct node
  7. {
  8. int ax, ay, bx, by, cx, cy, step;
  9. };
  10. node s;
  11. int bfs()
  12. {
  13. int nx[][] = {, , , , , -, -, };
  14. queue<node>Q;
  15. s.step = ;
  16. Q.push(s);
  17. while(!Q.empty())
  18. {
  19. s = Q.front();
  20. Q.pop();
  21. if(mp[s.ax][s.ay]=='X'&&mp[s.bx][s.by]=='X'&&mp[s.cx][s.cy]=='X') return s.step;
  22. for(int i = ; i < ; i++)
  23. {
  24. node t;
  25. t.ax = s.ax + nx[i][], t.bx = s.bx + nx[i][], t.cx = s.cx + nx[i][];
  26. t.ay = s.ay + nx[i][], t.by = s.by + nx[i][], t.cy = s.cy + nx[i][];
  27. if(t.ax<||t.ax>=n) t.ax = s.ax;
  28. if(t.ay<||t.ay>=n) t.ay = s.ay;
  29. if(t.bx<||t.bx>=n) t.bx = s.bx;
  30. if(t.by<||t.by>=n) t.by = s.by;
  31. if(t.cx<||t.cx>=n) t.cx = s.cx;
  32. if(t.cy<||t.cy>=n) t.cy = s.cy;
  33. for(int j = ; j <= ; j++) //这里循环3是因为不能让3个小人重合,若循环1次因为走位的次序不同可能还会重合
  34. {
  35. if(mp[t.ax][t.ay]=='#'||(t.ax==t.bx&&t.ay==t.by)||(t.ax==t.cx&&t.ay==t.cy)) t.ax=s.ax, t.ay=s.ay;
  36. if(mp[t.bx][t.by]=='#'||(t.bx==t.ax&&t.by==t.ay)||(t.bx==t.cx&&t.by==t.cy)) t.bx=s.bx, t.by=s.by;
  37. if(mp[t.cx][t.cy]=='#'||(t.cx==t.bx&&t.cy==t.by)||(t.cx==t.ax&&t.cy==t.ay)) t.cx=s.cx, t.cy=s.cy;
  38. }
  39. if(vis[t.ax][t.ay][t.bx][t.by][t.cx][t.cy]) continue;
  40. vis[t.ax][t.ay][t.bx][t.by][t.cx][t.cy] = ;
  41. t.step = s.step+;
  42. Q.push(t);
  43. }
  44. }
  45. return -;
  46. }
  47. int main()
  48. {
  49. int cas = , t;
  50. cin>>t;
  51. while(t--)
  52. {
  53. scanf("%d", &n);
  54. memset(vis, , sizeof vis);
  55. for(int i = ; i < n; i++)
  56. scanf("%s", mp[i]);
  57. for(int i = ; i < n; i++)
  58. for(int j = ; j < n; j++)
  59. {
  60. if(mp[i][j] == 'A')
  61. s.ax = i, s.ay = j;
  62. if(mp[i][j] == 'B')
  63. s.bx = i, s.by = j;
  64. if(mp[i][j] == 'C')
  65. s.cx = i, s.cy = j;
  66. }
  67. vis[s.ax][s.ay][s.bx][s.by][s.cx][s.cy] = ;
  68. printf("Case %d: ", ++cas);
  69. int ans = bfs();
  70. if(ans==-) puts("trapped");
  71. else printf("%d\n", ans);
  72. }
  73. return ;
  74. }

【lightoj-1055】Going Together(BFS)的更多相关文章

  1. 【LightOJ - 1205】Palindromic Numbers

    [链接]https://cn.vjudge.net/problem/LightOJ-1205 [题意] 求出L..R范围内的回文个数 [题解] 数位DP; 先求出1..x里面的回文串个数.则做一下前缀 ...

  2. 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP

    这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...

  3. 【POJ - 3414】Pots(bfs)

    Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i)        将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...

  4. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  5. 【HDU - 3533】Escape(bfs)

    Escape  Descriptions: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y问这个人能不能安全到 ...

  6. 【Aizu - 0558】Cheese(bfs)

    -->Cheese 原文是日语,这里就写中文了 Descriptions: 在H * W的地图上有N个奶酪工厂,每个工厂分别生产硬度为1-N的奶酪.有一只老鼠准备从出发点吃遍每一个工厂的奶酪.老 ...

  7. 【LightOJ 1422】Halloween Costumes(区间DP)

    题 题意 告诉我们每天要穿第几号衣服,规定可以套好多衣服,所以每天可以套上一件新的该号衣服,也可以脱掉一直到该号衣服在最外面.求最少需要几件衣服. 分析 DP,dp[i][j]表示第i天到第j天不脱第 ...

  8. 【LightOJ 1136】Division by 3(简单数学)

    BUPT2017 wintertraining(16) #5 C HDU - 1021 题意 1, 12, 123, 1234, ..., 12345678910, ... 问第a到第b个数(incl ...

  9. 【LightOJ 1081】Square Queries(二维RMQ降维)

    Little Tommy is playing a game. The game is played on a 2D N x N grid. There is an integer in each c ...

  10. 【HIHOCODER 1055】 刷油漆(树上背包)

    描述 小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是处于1..N的范围之内,每根木棍都连接着两个不同的小球,并且保 ...

随机推荐

  1. python列表套字典数据类型转换

    1.题目 list3 = [ {'name':'Alex','hobby':'抽烟'}, {'name':'Alex', 'hobby':'喝酒'}, {'name':'Alex', 'hobby': ...

  2. 我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug

    1.错误描述 今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null.而之前已经提测快一个月的 ...

  3. MySQL数据库(3)- 完整性约束、外键的变种、单表查询

    一.完整性约束 在创建表时候,约束条件和数据类型的宽度都是可选参数. 作用:用于保证数据的完整性和一致性. 1.not null(不可空)与default 示例一:插入一个空值,如下: mysql&g ...

  4. Python高级教程-切片

    Python中的切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['A','B','C','D'] 对经常取指定索引范围的操作, ...

  5. Hadoop源码如何查看

    如何查看hadoop源码 1解压hadoop安装压缩文件成为文件夹,再进入解压后的文件夹下的src文件夹,选中core,hdfs,mapred三个文件夹

  6. C++中的默认成员函数

    一般而言,对于一个用户自定义的类类型,以下四个函数在用户没有自定义的情形下,会由编译器自动生成: 1.default constructor 2.copy constructor Someclass: ...

  7. day2 笔记

    while 条件:           # 循环体       # 如果条件为真,那么循环体则执行     # 如果条件为假,那么循环体不执行         循环中止语句 如果在循环的过程中,因为某 ...

  8. Node.js API学习笔记(二)

    本文发表于本人博客. 上一节笔记说到创建Buffer实例,这节继续讲Buffer.本节讲解下Buffer的一些静态方法.写入以及读取方法. Buffer.isEncoding(编码)判断nodejs是 ...

  9. .net:上传图片并将保存至指定目录下(支持PC端和移动端)

    页面: <body> <form id="formid" name="myform" action="Upload" me ...

  10. cf100989b

    http://codeforces.com/gym/100989/my B. LCS (B) time limit per test 0.25 seconds memory limit per tes ...