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.(因为理解错了题意,当成三个旗子可以随意朝向而不是统一朝向!看我下一篇博客,泪~~)
 
/*
//下面 极大值测试
9
AB....C..
.........
.........
.........
.........
.........
.........
.........
X..X..X.. */ #include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define N 10
#define inf 0x3f3f3f3f
char mp[N][N];
int n;
struct node{
int x,y;
};
struct group{//一个局面三个点的位置,位置之间等价
node p[];//0,1,2三位有效存储
int step;
}st;
int dir[][]={{,},{,},{,-},{-,} };
bool vis[N][N][N][N][N][N];//标记数组,模拟每一组棋子组合成的局面
bool judge_end(group x){ //判断当前局面是否达到结束要求
int num=;
for(int i=;i<;i++){
if(mp[x.p[i].x][x.p[i].y]=='X')
num++;
}
if(num==)return true;
return false;
}
bool judge_node(node a){
if(a.x>=&&a.y>=&&a.x<n&&a.y<n&&mp[a.x][a.y]!='#')
return true;
return false;
}
void getvis(group a){//从一个局面获取1个标记即可,剩余5个意义不大(这步在下篇博客上意义较大)
vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
/* 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;
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;
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;
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;
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;*/
}
void debug(group a){
printf("*%dstep* *A*(%d,%d) ",a.step,a.p[].x,a.p[].y);
printf("*B*(%d,%d) ",a.p[].x,a.p[].y);
printf("*C*(%d,%d)\n",a.p[].x,a.p[].y);
}
bool cmp(node a,node b){
return (a.x==b.x)&&(a.y==b.y);
} int bfs(){
memset(vis,false,sizeof(vis));
group now,ne;
queue<group>Q;
st.step=;
Q.push(st); //标记起点局面
getvis(st);
while(Q.size()){
now=Q.front();
Q.pop();
if(judge_end(now))return now.step; for(int i=;i<;i++){//四种命令的走法
node p1,p2,p3;
p1.x=now.p[].x+dir[i][];
p1.y=now.p[].y+dir[i][];
p2.x=now.p[].x+dir[i][];
p2.y=now.p[].y+dir[i][];
p3.x=now.p[].x+dir[i][];
p3.y=now.p[].y+dir[i][];
ne=now;//初始化
if(judge_node(p1))//p1p2p3表示的下一位置,合法则移动
ne.p[]=p1;
if(judge_node(p2))
ne.p[]=p2;
if(judge_node(p3))
ne.p[]=p3;
//一个格点上只能站一个人,站的人多于一个了,就撤回去
for(int j=;j>=;j--){
if(cmp(ne.p[],ne.p[])||cmp(ne.p[],ne.p[]))
ne.p[]=now.p[];
if(cmp(ne.p[],ne.p[])||cmp(ne.p[],ne.p[]))
ne.p[]=now.p[];
if(cmp(ne.p[],ne.p[])||cmp(ne.p[],ne.p[]))
ne.p[]=now.p[];
}
if(vis[ne.p[].x][ne.p[].y][ne.p[].x][ne.p[].y][ne.p[].x][ne.p[].y])
continue;//已经标记过的
else
getvis(ne);
ne.step=now.step+;
// debug(ne);
if(judge_end(ne))return ne.step;
else Q.push(ne);
}
}
return -;
}
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=;i<n;i++)//读图
scanf("%s",mp[i]);
int num1=;
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(mp[i][j]>='A'&&mp[i][j]<='C')
st.p[num1].x=i,st.p[num1++].y=j;
}
}
printf("Case %d: ",++cas);
int ans=bfs();
if(ans!=-)
printf("%d\n",ans);
else
printf("trapped\n");
} return ;
}

【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. keepalived+lvs tcp check 引起的后端服务报Connection reset by peer

    方法一: 取消LVS方式进行tcp转发,进而改为http方式反向代理,问题即可解决. 当然,这是在业务允许使用http的情况下,如果必须使用tcp协议,那就得使用下面的方法了. 方法二: 修改keep ...

  2. 《Netty实战》源码运行及本地环境搭建

     1.源码路径: GitHub - zzzvvvxxxd/netty-in-action-cn: Netty In Action 中文版 ,中文唯一正版<Netty实战>的代码清单 下载后 ...

  3. LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)

    199. 二叉树的右视图 199. Binary Tree Right Side View 题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. Giv ...

  4. Nginx启动和停止

    启动nginx [root@LinuxServer sbin]#  /usr/local/nginx/sbin/nginx     -c     /usr/local/nginx/conf/nginx ...

  5. Spring 中的统一异常处理

    在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的.因此,肯定需要在Controller捕获所有异常,并且做适当处理,返回给前端一个友好的错误码. 不过, ...

  6. Web基础和servlet基础

    TomCat的目录结构 Bin:脚本目录(存放启动.关闭这些命令) Conf:存放配置文件的目录 Lib:存放jar包 Logs: 存放日志文件 Temp: 临时文件 Webapps: 项目发布目录 ...

  7. Ubuntu的apt命令详解()deepin linux是在Ubuntu基础上开发的

    apt-cache和apt-get是apt包的管理工具,他们根据/etc/apt/sources.list里的软件源地址列表搜索目标软件.并通过维护本地软件包列表来安装和卸载软件. 查看本机是否安装软 ...

  8. PAT(B) 1088 三人行(Java)

    题目链接:1088 三人行 (20 point(s)) 参考博客:PAT (Basic Level) Practice (中文)1088 三人行 (20 分)(Java实现)吃口雪花 题目描述 子曰: ...

  9. rabbitMQ 重试

    rabbitMQ 重试机制 spring.rabbitmq.listener.simple.retry.max-attempts=5 最大重试次数spring.rabbitmq.listener.si ...

  10. Qt4 和 Qt5 模块的分类

    Qt5 与 Qt4 其中的一个区别是底层架构进行了改变,Qt5 引入了更加详细的模块化的概念,将众多功能细分到几个模块之中,Qt4 则是一种粗略的划分.本文主要对 Qt5 和 Qt4的模块进行一个简单 ...