Problem Description
Unlike single maze, double maze requires a common sequence of commands to solve both mazes. See the figure below for a quick understanding.

A maze is made up of 6*6 cells. A cell can be either a hole or a square. Moreover, a cell may be surrounded by barriers. There is ONLY one start cell (with a ball) and ONLY one end cell (with a star) in a single maze.These two cells are both squares. It is possible that the start cell and the end cell are the same one. The goal of a single maze is to move the ball from the start cell to the end cell. There are four commands in total,'L', 'D', 'R' and 'U' corresponding to moving the ball left, down, right and up one cell, respectively. The barriers may make the commands take no effect, i.e., the ball does NOT move if there is a barrier on the way.
When the ball gets to a hole or outside of the maze, it fails. A double maze is made up of two single mazes. The commands control two balls simultaneously, and the movements of two balls are according to the rules described above independently. Both balls will continue to move simultaneously if at least one of the balls has not got to the end cell.
So, a ball may move out of the end cell since the other ball has not been to the target. A double maze passes when both balls get to their end cells, or fails if either of the two mazes fails. The goal of double maze is to get the shortest sequence of commands to pass. If there are multiple solutions, get the lexical minimum one.
To simplify the input, a cell is encoded to an integer as follows. The lowest 4 bits signal the existence of the barriers around a cell. The fifth bit indicates whether a cell is a hole or not. The sixth and seventh bits are set for the start cell and end cell. Details are listed in the following table with bits counted from lowest bit. For a barrier, both of the two adjacent cells will have the corresponding barrier bit set. Note that the first two mazes in the sample input is the encoding of two mazes in the figure above, make sure you understand the encoding right.

 
Input
The first line of input gives the total number of mazes, T (1 < T ≤ 20). Then follow T mazes. Each maze is a 6*6 matrix, representing the encoding of the original maze. There is a blank line between mazes.
 
Output
For every two consecutive mazes, you should treat them as a double maze and output the answer. So there are actually T - 1 answers. For each double maze, output the shortest sequence of commands to pass. If there are multiple solutions, output the lexicographically minimum one. If there is no way to pass, output -1 instead.
 
Sample Input
3
16 0 18 16 18 24
20 19 24 16 28 1
18 28 17 0 22 17
25 20 17 18 88 20
2 16 48 28 17 16
24 16 16 20 23 1

16 0 18 16 18 24
20 19 24 20 29 1
18 28 17 16 22 17
8 20 1 18 24 20
19 80 48 24 16 0
24 16 16 16 22 19

18 16 18 16 18 80
24 18 24 16 24 18
18 24 0 0 18 24
24 18 0 0 24 18
18 24 18 16 18 24
56 18 24 18 24 18

 
Sample Output
RRLULLLRRDLU
RURDRLLLURDULURRRRRDDU
 
Author
GAO, Yuan
 
Source
 
Recommend
zhengfeng

题意:给出两个迷宫,每个迷宫各有起点和终点,有的格子能走有的不行,格子与格子之间还可能有护栏。同时控制两个迷宫每次朝同一个方向移动,问最快使得两个迷宫同时到达终点的步数,有多个最优解输出字典序最小的一个。

思路:把两个图合成一个图,建边,用bfs,总共也就6的4次方个点。以dlru的顺序查找,找到的保证字典序最小。用一个数组记录其前驱点,找到答案后倒着输出就好。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; #define two(x) (1<<x)
#define inf 200000000
int T;
char c[4]={'D','L','R','U'};
int d[2][37][4],st[2],en[2],f[37][37];
bool can[2][37];
int fa1[37][37],fa2[37][37],dir[37][37],ans[2000]; void init(int cur)
{
memset(d[cur],0,sizeof(d[cur]));
memset(can[cur],1,sizeof(can[cur]));
int x;
for (int i=1;i<=6;++i)
for (int j=1;j<=6;++j)
{
int t=(i-1)*6+j;
scanf("%d",&x);
if (x & two(1)) d[cur][t][0]=t;
else if (i<6) d[cur][t][0]=t+6;
if (x & two(0)) d[cur][t][1]=t;
else if (j>1) d[cur][t][1]=t-1;
if (x & two(2)) d[cur][t][2]=t;
else if (j<6) d[cur][t][2]=t+1;
if (x & two(3)) d[cur][t][3]=t;
else if (i>1) d[cur][t][3]=t-6;
if ((x & two(4))==0) can[cur][t]=false;
if (x & two(5)) st[cur]=t;
if (x & two(6)) en[cur]=t;
}
} void bfs()
{
queue<int> q1,q2;
bool p[37][37];
memset(p,1,sizeof(p));
q1.push(st[0]);
q2.push(st[1]);
p[st[0]][st[1]]=false;
while (!q1.empty())
{
int x=q1.front(),y=q2.front();
q1.pop();q2.pop();
for (int i=0;i<=3;++i)
{
int tx=d[0][x][i],ty=d[1][y][i];
if (tx && ty && can[0][tx] && can[1][ty])
if (p[tx][ty])
{
q1.push(tx);
q2.push(ty);
p[tx][ty]=false;
fa1[tx][ty]=x;
fa2[tx][ty]=y;
dir[tx][ty]=i;
}
}
}
} void solve()
{
memset(dir,-1,sizeof(dir));
dir[st[0]][st[1]]=5;
bfs();
int x=en[0],y=en[1];
if (dir[x][y]==-1)
{
printf("-1\n");
return;
}
int tot=0,tx,ty;
while (!(x==st[0] && y==st[1]))
{
ans[++tot]=dir[x][y];
tx=fa1[x][y];
ty=fa2[x][y];
x=tx;y=ty;
}
for (int i=tot;i>0;--i)
printf("%c",c[ans[i]]);
printf("\n");
} int main()
{
scanf("%d",&T);
init(1);
for (int i=2;i<=T;++i)
{
init(1 & i);
solve();
}
return 0;
}

  

hdu3713 Double Maze的更多相关文章

  1. hdu - 2216 Game III && xtu 1187 Double Maze (两个点的普通bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2216 zjt和sara在同一个地图里,zjt要去寻找sara,zjt每移动一步sara就要往相反方向移动,如果他 ...

  2. UVA 10531 Maze Statistics 迷宫统计 迷宫插头DP 四联通 概率

    题意: 有一个N*M的图,每个格子有独立概率p变成障碍物.你要从迷宫左上角走到迷宫右下角.求每个格子成为一个有解迷宫中的障碍物的概率.N <= 5,M <= 6 分析: 这真是一道好题,网 ...

  3. HDU 3853:LOOPS(概率DP)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Problem Description   Akemi Homura is a M ...

  4. HDU 4035:Maze(概率DP)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=4035 Maze Special Judge Problem Description   When w ...

  5. HDU-4035 Maze

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 树上的概率dp.   Maze Time Limit: 2000/1000 MS (Java/Others ...

  6. hdu 4035 Maze(期待更多经典的树DP)

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submi ...

  7. Maze HDU - 4035(期望dp)

    When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...

  8. hdu4035 Maze

    题目链接 hdu4035 Maze 题解 f[u]表示在节点u通关的所需的边数期望 转移方程分叶子节点和非叶子点讨论 发现都可以化成f[x]=af[1]+bf[dad]+c的形式 然后推一下系数 还是 ...

  9. Meandering Through the Maze of MFC Message and Command Routing MFC消息路由机制分析

    Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a free ...

随机推荐

  1. vue 实现 tomato timer(蕃茄钟)

    近期在学习[时间管理]方面的课程,其中有一期讲了蕃茄工作法,发现是个好多东西.蕃茄工作法核心思想就是:工作25分钟,休息5分钟.如果您好了解更多可以自行度娘. 在加上本人是一个程序猿,就想用程序的方式 ...

  2. (转)java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  3. Unity Shader入门教程(四)反射光斑的实现

    本节内容介绍PhongModel(也就是上文说的反射光的计算模型),采用的计算方法是BlinPhong(也即是用视线方向V+光源方向L的和,与N做点积,随后幂化得到高光反射系数)下图采用了csdn博文 ...

  4. 5.spark弹性分布式数据集

    弹性分布式数据集 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分布式数据集 ...

  5. [COGS 0011] 运输问题1

    11. 运输问题1 ★★☆   输入文件:maxflowa.in   输出文件:maxflowa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     一个工厂每天生 ...

  6. 2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼

    2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼   转眼又已过去了一年,在这一年里,Firefox 和 Chrome 在拼升级,版本号不断飙升:IE10 随着 Windows 8 在 ...

  7. springMVC两种方式实现多文件上传及效率比较

    springMVC实现 多文件上传的方式有两种,一种是我们经常使用的以字节流的方式进行文件上传,另外一种是使用springMVC包装好的解析器进行上传.这两种方式对于实 现多文件上传效率上却有着很大的 ...

  8. HttpRequest 类

    关于此类的介绍:查看HttpRequest类 点击查看:HttpRequest中方法的封装 跟这个类对应的HttpResponse类 定义:使 ASP.NET 能够读取客户端在 Web 请求期间发送的 ...

  9. akoj-1148-小光棍数

    小光棍数 Time Limit:1000MS  Memory Limit:65536K Total Submit:197 Accepted:94 Description 最近Topcoder的XD遇到 ...

  10. Linux配置全局jdk

    Linux配置全局jdk 1.确保相应文件夹下有apache-tomcat和jdk的压缩文件 注意:jdk文件必须为适应Linux版本的文件 (如果已经有了相应文件,可以跳过以下第2-3个步骤) 2. ...