light oj 1055-Going Together

题目大致意思:

  简单的三个棋子,每次可以下达一个命令,robots全部按照指令进行前进;若下一步不为空地则停留在原地。
  特殊考虑:
     1.例如ABC.....,(或者AB#...C——C需要再次向左移动,AB则不能再次移动)A已经在边界上;这时命令三个棋子全部向左前进,AB就挤到了一块去——然后依次撤回到上一步初始的now状态,至少跑两次循环!
                 2.或者,ABC每次移动单个棋子时,先首先预判  移动的地方是否有空闲位置!注意ABC连在一块就当不存在处理,因为ABC在一块向左向右都OK可以动!

特别注意:

  A single command will be activated for the three robots simultaneously.(因为理解错了题意,当成三个旗子可以随意朝向而不是统一朝向!看我下一篇博客,泪~~)
 
  1. /*
  2. //下面 极大值测试
  3. 9
  4. AB....C..
  5. .........
  6. .........
  7. .........
  8. .........
  9. .........
  10. .........
  11. .........
  12. X..X..X..
  13.  
  14. */
  15.  
  16. #include<stdio.h>
  17. #include<math.h>
  18. #include<iostream>
  19. #include<string.h>
  20. #include<vector>
  21. #include<queue>
  22. #include<algorithm>
  23. using namespace std;
  24. #define N 10
  25. #define inf 0x3f3f3f3f
  26. char mp[N][N];
  27. int n;
  28. struct node{
  29. int x,y;
  30. };
  31. struct group{//一个局面三个点的位置,位置之间等价
  32. node p[];//0,1,2三位有效存储
  33. int step;
  34. }st;
  35. int dir[][]={{,},{,},{,-},{-,} };
  36. bool vis[N][N][N][N][N][N];//标记数组,模拟每一组棋子组合成的局面
  37. bool judge_end(group x){ //判断当前局面是否达到结束要求
  38. int num=;
  39. for(int i=;i<;i++){
  40. if(mp[x.p[i].x][x.p[i].y]=='X')
  41. num++;
  42. }
  43. if(num==)return true;
  44. return false;
  45. }
  46. bool judge_node(node a){
  47. if(a.x>=&&a.y>=&&a.x<n&&a.y<n&&mp[a.x][a.y]!='#')
  48. return true;
  49. return false;
  50. }
  51. void getvis(group a){//从一个局面获取1个标记即可,剩余5个意义不大(这步在下篇博客上意义较大)
  52. vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
  53. /* vis[a.p[0].x][a.p[0].y][a.p[2].x][a.p[2].y][a.p[1].x][a.p[1].y]=true;
  54. vis[a.p[1].x][a.p[1].y][a.p[0].x][a.p[0].y][a.p[2].x][a.p[2].y]=true;
  55. vis[a.p[1].x][a.p[1].y][a.p[2].x][a.p[2].y][a.p[0].x][a.p[0].y]=true;
  56. vis[a.p[2].x][a.p[2].y][a.p[1].x][a.p[1].y][a.p[0].x][a.p[0].y]=true;
  57. vis[a.p[2].x][a.p[2].y][a.p[0].x][a.p[0].y][a.p[1].x][a.p[1].y]=true;*/
  58. }
  59. void debug(group a){
  60. printf("*%dstep* *A*(%d,%d) ",a.step,a.p[].x,a.p[].y);
  61. printf("*B*(%d,%d) ",a.p[].x,a.p[].y);
  62. printf("*C*(%d,%d)\n",a.p[].x,a.p[].y);
  63. }
  64. bool cmp(node a,node b){
  65. return (a.x==b.x)&&(a.y==b.y);
  66. }
  67.  
  68. int bfs(){
  69. memset(vis,false,sizeof(vis));
  70. group now,ne;
  71. queue<group>Q;
  72. st.step=;
  73. Q.push(st); //标记起点局面
  74. getvis(st);
  75. while(Q.size()){
  76. now=Q.front();
  77. Q.pop();
  78. if(judge_end(now))return now.step;
  79.  
  80. for(int i=;i<;i++){//四种命令的走法
  81. node p1,p2,p3;
  82. p1.x=now.p[].x+dir[i][];
  83. p1.y=now.p[].y+dir[i][];
  84. p2.x=now.p[].x+dir[i][];
  85. p2.y=now.p[].y+dir[i][];
  86. p3.x=now.p[].x+dir[i][];
  87. p3.y=now.p[].y+dir[i][];
  88. ne=now;//初始化
  89. if(judge_node(p1))//p1p2p3表示的下一位置,合法则移动
  90. ne.p[]=p1;
  91. if(judge_node(p2))
  92. ne.p[]=p2;
  93. if(judge_node(p3))
  94. ne.p[]=p3;
  95. //一个格点上只能站一个人,站的人多于一个了,就撤回去
  96. for(int j=;j>=;j--){
  97. if(cmp(ne.p[],ne.p[])||cmp(ne.p[],ne.p[]))
  98. ne.p[]=now.p[];
  99. if(cmp(ne.p[],ne.p[])||cmp(ne.p[],ne.p[]))
  100. ne.p[]=now.p[];
  101. if(cmp(ne.p[],ne.p[])||cmp(ne.p[],ne.p[]))
  102. ne.p[]=now.p[];
  103. }
  104. if(vis[ne.p[].x][ne.p[].y][ne.p[].x][ne.p[].y][ne.p[].x][ne.p[].y])
  105. continue;//已经标记过的
  106. else
  107. getvis(ne);
  108. ne.step=now.step+;
  109. // debug(ne);
  110. if(judge_end(ne))return ne.step;
  111. else Q.push(ne);
  112. }
  113. }
  114. return -;
  115. }
  116. int main()
  117. {
  118. int T,cas=;
  119. scanf("%d",&T);
  120. while(T--){
  121. scanf("%d",&n);
  122. for(int i=;i<n;i++)//读图
  123. scanf("%s",mp[i]);
  124. int num1=;
  125. for(int i=;i<n;i++){
  126. for(int j=;j<n;j++){
  127. if(mp[i][j]>='A'&&mp[i][j]<='C')
  128. st.p[num1].x=i,st.p[num1++].y=j;
  129. }
  130. }
  131. printf("Case %d: ",++cas);
  132. int ans=bfs();
  133. if(ans!=-)
  134. printf("%d\n",ans);
  135. else
  136. printf("trapped\n");
  137. }
  138.  
  139. return ;
  140. }

【loj-1055-Going Together-三个棋子推箱子走到目的地--讲预判的bfs】的更多相关文章

  1. hdu 1254 推箱子(搜索)

    我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...

  2. 使用 C# 开发智能手机软件:推箱子(三)

    这是"使用 C# 开发智能手机软件:推箱子"系列文章的第三篇.在这篇文章中,介绍 Common/Block.cs 源程序文件.   1 namespace Skyiv.Ben.Pu ...

  3. C++学习(三十七)(C语言部分)之 链式栈(推箱子实现)

    用链表实现栈一开始在表头插入,就要一直在表头插入一开始在表尾插入,就要一直在表头插尾表头当栈底 也可以把表尾当栈底 实现的测试代码笔记如下: #include<stdio.h> #incl ...

  4. JavaScript写一个小乌龟推箱子游戏

    推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...

  5. 用C#制作推箱子小游戏

    思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图  (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...

  6. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

  7. javascript 推箱子游戏介绍及问题

    最近没什么事情,我的一个亲戚在学校学习PHP,课程中老师让他们编写一个javascript版本的推箱子小游戏,他没什么头绪,就来问我,我当时很闲,就随口答应他包在我身上.结果真正写的时候还是花了点时间 ...

  8. 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 推箱子是一款经典游戏.如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点. 规 ...

  9. C语言小程序——推箱子(窄字符和宽字符)

    C语言小程序——推箱子(窄字符Version) 推箱子.c #include <stdio.h> #include <conio.h> #include <stdlib. ...

随机推荐

  1. 解决jQuery版本冲突

    解决jquery版本冲突问题 <!-- 引入1.6.4版的jq --><script src="http://ajax.googleapis.com/ajax/libs/j ...

  2. date.toLocaleString()的替换

    Date date = new Date(); System.out.println("前:" + date.toLocaleString()); SimpleDateFormat ...

  3. 判断List集合为空还是null的正确打开方式

    事故场景还原 最近在写一个项目的时候遇到一个这样一个问题,我简单的还原一下场景,这是模拟一个简单的管理系统 ① 一张简单的客户表 CREATE TABLE customer( id INT(11) N ...

  4. TensorSpace:超酷炫3D神经网络可视化框架

    TensorSpace:超酷炫3D神经网络可视化框架 TensorSpace - 一款 3D 模型可视化框架,支持多种模型,帮助你可视化层间输出,更直观地展示模型的输入输出,帮助理解模型结构和输出方法 ...

  5. 037 Android Glide图片加载开源框架使用

    1.Glide简单介绍 Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片.Glide是一个快速高效的Androi ...

  6. Gulp-构建工具 相关内容整理

    Gulp- 简介 Automate and enhance your workflow | 用自动化构建工具增强你的工作流程 Gulp 是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自 ...

  7. python 之 re模块、hashlib模块

    6.16 re模块 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 ...

  8. html页面在苹果手机内,safari浏览器,微信中滑动不流畅问题解决方案

    1. -webkit-overflow-scrolling:touch是什么? MDN上是这样定义的: -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效 ...

  9. 软键盘 显示隐藏 测量高度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. Java架构笔记:用JWT对SpringCloud进行认证和鉴权

    写在前面 喜欢的朋友可以关注下专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. image.png JWT(JSON WEB TOKEN)是基于RF ...