Home Problems       Logout
-11:24:01
 
 

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

O - Bloxorz I

Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit 
Status

Description

Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which makes him excited. It's a game about rolling a box to a specific position on a special plane. Precisely, the plane, which is composed of several unit cells, is a rectangle shaped area. And the box, consisting of two perfectly aligned unit cube, may either lies down and occupies two neighbouring cells or stands up and occupies one single cell. One may move the box by picking one of the four edges of the box on the ground and rolling the box 90 degrees around that edge, which is counted as one move. There are three kinds of cells, rigid cells, easily broken cells and empty cells. A rigid cell can support full weight of the box, so it can be either one of the two cells that the box lies on or the cell that the box fully stands on. A easily broken cells can only support half the weight of the box, so it cannot be the only cell that the box stands on. An empty cell cannot support anything, so there cannot be any part of the box on that cell. The target of the game is to roll the box standing onto the only target cell on the plane with minimum moves.



The box stands on a single cell



The box lies on two neighbouring cells, horizontally



The box lies on two neighbouring cells, vertically

After Little Tom passes several stages of the game, he finds it much harder than he expected. So he turns to your help.

Input

Input contains multiple test cases. Each test case is one single stage of the game. It starts with two integers R and C(3 ≤ R, C ≤ 500) which stands for number of rows and columns of the plane. That follows the plane, which contains R lines and C characters for each line, with 'O' (Oh) for target cell, 'X' for initial position of the box, '.' for a rigid cell, '#' for a empty cell and 'E' for a easily broken cell. A test cases starts with two zeros ends the input.

It guarantees that

  • There's only one 'O' in a plane.
  • There's either one 'X' or neighbouring two 'X's in a plane.
  • The first(and last) row(and column) must be '#'(empty cell).
  • Cells covered by 'O' and 'X' are all rigid cells.

Output

For each test cases output one line with the minimum number of moves or "Impossible" (without quote) when there's no way to achieve the target cell.

Sample Input

7 7
#######
#..X###
#..##O#
#....E#
#....E#
#.....#
#######
0 0

Sample Output

10
很水的bfs,要注意,走时候箱子,是沿着最底下四个边,向四个方向进行翻转,这样就可以用三个状态来标记,有横树和站着三种,这样开一个三维数组就足以保存,但这样的速度是不今人满意的,下次写个双向bfs
#include <iostream>
#include <stdio.h>
#include<string.h>
#include <queue>
using namespace std ;
int n,m,map[605][605],endx,endy,visit[600][600][3]; struct boxtree{
int step,x[2],y[2],state;
};
int fmin(int a,int b)
{
if(a<b)
return a;
else
return b;
}
boxtree p,temp,start;
int dir[3][4][5]={
{
0,-2,0,-1,1,
1,0,2,0,2,
0,1,0,2,1,
-2,0,-1,0,2
},
{
0,-1,-3,-3,0,
1,0,1,1,1,
0,2,-3,-3,0,
-1,0,-1,1,1
},
{
0,-1,1,-1,2,
2,0,-3,-3,0,
0,1,1,1,2,
-1,0,-3,-3,0,
}
};
void init()
{
char str[200];
int i,j;
char c; start.x[0]=start.x[1]=start.y[0]=start.y[1]=-1;
gets(str);//吸入回车
for( i=0;i<n;i++)
{
for( j=0;j<m;j++)
{
c=getchar();
if(c=='#')
{
map[i][j]=0;//不可放
}
else if(c=='.')
{
map[i][j]=2;//可以完全放
}
else if(c=='E')//只能放一半
{
map[i][j]=1;
}
else if(c=='O')
{
endx=i;
endy=j;
map[i][j]=2;//题目起始和终点都是牢固的
}
else if( c=='X')
{
map[i][j]=2;
if(start.x[0]==-1)
{
start.x[0]=i;
start.y[0]=j;
start.state=0; //站着的壮态
}
else
{
start.x[1]=i;
start.y[1]=j;
start.state=1;
if((start.x[0]==start.x[1])&&(start.y[0]!=start.y[1]))
{
start.state=1;//横着的状态
start.y[0]=fmin(start.y[0],start.y[1]);//横着的状态选左边为参照点
}
else if((start.x[0]!=start.x[1])&&(start.y[0]==start.y[1]))
{
start.state=2;//树着的状态
start.x[0]=fmin(start.x[0],start.x[1]);//树着的选上边为参照点
}
} }
}
gets(str); }
//gets(str);
// printf("%d%d end\n",endx,endy);
}
bool changestate(int i)
{
p.x[0]=temp.x[0]+dir[temp.state][i][0];//都是和相应的参照点进行变换
p.y[0]=temp.y[0]+dir[temp.state][i][1];
p.x[1]=temp.x[0]+dir[temp.state][i][2];
p.y[1]=temp.y[0]+dir[temp.state][i][3];
p.state=dir[temp.state][i][4]; if(p.state==0)//如果是站的状态
{
if((p.x[0]>=0)&&(p.x[0]<n)&&(p.y[0]>=0&&p.y[0]<m)&&(map[p.x[0]][p.y[0]]==2)&&(visit[p.x[0]][p.y[0]][0]==0))
{
visit[p.x[0]][p.y[0]][0]=1;//标记为已访问
return true;
}
else
{
return false ;
}
}
else if(p.state==1)//如果是横着的状态
{
if((p.x[0]>=0)&&(p.x[0]<n)&&(p.y[0]>=0&&p.y[0]<m-1)&&(map[p.x[0]][p.y[0]]!=0)&&(map[p.x[1]][p.y[1]]!=0)&&(visit[p.x[0]][p.y[0]][1]==0))
{
visit[p.x[0]][p.y[0]][1]=1;//标记为已访问
return true;
}
else
{
return false ;
} }
else if( p.state==2)//如果是树的状态
{
if((p.x[0]>=0)&&(p.x[0]<n-1)&&(p.y[0]>=0&&p.y[0]<m)&&(map[p.x[0]][p.y[0]]!=0)&&map[p.x[1]][p.y[1]]!=0&&(visit[p.x[0]][p.y[0]][2]==0))
{
visit[p.x[0]][p.y[0]][2]=1;//标记为已访问
return true;
}
else
{
return false ;
} } return false ;
}
int bfs()
{
int i;
queue<boxtree> q;
memset(visit,0,sizeof(visit)); while(!q.empty())//清空
{
q.pop();
} start.step=0;
q.push(start);
while(!q.empty())
{
temp=q.front();
q.pop(); for( i=0;i<4;i++)//4 个方向进行搜
{ if(changestate(i))
{
p.step=temp.step+1;
q.push(p);
// printf("%d %d %d\n",p.x[0],p.y[0],p.state);
if((p.x[0]==endx)&&(p.y[0]==endy)&&(p.state==0))
{
printf("%d\n",p.step);
return 1;
}
}
}
}
printf("Impossible\n");
return -1;
}
int main()
{ while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
init();
bfs();
} return 0;
}


FAQ | About Virtual Judge |  Forum |  Discuss |  Open Source Project
All Copyright Reserved ©2010-2012 
HUST ACM/ICPC TEAM 

Anything about the OJ, please ask in the 
forum, or contact author:
Isun

Server Time: 

poj3322 Bloxorz I的更多相关文章

  1. POJ3322 Bloxorz I 无脑广搜(我死了。。。)

    多测不清空,爆零两行泪....我死了QWQ 每个节点3个状态:横坐标,纵坐标,和方向 说一下方向:0:立着,1:竖着躺着,上半部分在(x,y),2:横着躺着,左半部分在(x,y) 然后就有了常量数组: ...

  2. POJ3322Bloxorz I

    POJ3322 Bloxorz I 暴搜,next数组与处理一下(小技巧) #include <cstdio> #include <iostream> #include < ...

  3. Bloxorz I (poj3322) (BFS)

    [题目描述] It's a game about rolling a box to a specific position on a special plane. Precisely, the pla ...

  4. Bloxorz I POJ - 3322 (bfs)

    Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which m ...

  5. 寒假训练——搜索 E - Bloxorz I

    Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which m ...

  6. POJ 3322 Bloxorz I

    首先呢 这个题目的名字好啊 ORZ啊 如果看不懂题意的话 请戳这里 玩儿几盘就懂了[微笑] http://www.albinoblacksheep.com/games/bloxorz 就是这个神奇的木 ...

  7. Bloxorz I (poj 3322 水bfs)

    Language: Default Bloxorz I Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5443   Acce ...

  8. POJ 3322 Bloxorz(算竞进阶习题)

    bfs 标准广搜题,主要是把每一步可能的坐标都先预处理出来,会好写很多 每个状态对应三个限制条件,x坐标.y坐标.lie=0表示直立在(x,y),lie=1表示横着躺,左半边在(x,y),lie=2表 ...

  9. 【POJ 3322】 Bloxorz I

    [题目链接] http://poj.org/problem?id=3322 [算法] 广度优先搜索 [代码] #include <algorithm> #include <bitse ...

随机推荐

  1. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...

  2. 使用Github的gh-pages分支展示一个页面

    Github有一个Github pages的功能可以搭建博客或者托管网页,是免费使用的. 首先你的注册Github账号 下载安装git Github官网操作 登录到Github上,创建一个名为 Git ...

  3. hdu 1171 有num1个w1 , num2个w2 ……. (母函数)

    输入n,代表学院里面有n种设备,并且在下面输入n行,每一行输入v,m代表设备的价格为v,设备的数量是m.然后要求把这些设备的总价值分摊,尽量平分,使其总价值接近相等,最好是相等 比如样例二(1+X10 ...

  4. spring-boot分环境打包为tar包

    1.pom配置 <!-- 多环境打包 start --> <profiles> <!-- 开发环境配置 --> <profile> <id> ...

  5. 利用Metrics+influxdb+grafana构建监控平台

    https://blog.csdn.net/fishmai/article/details/51817429

  6. xtrabckup备份报错:Failed to connect to MySQL server: Can't connect to local MySQL server through socket '/data/mysql/mysql.sock' (2).

    1.做软连接 [root@xxxxxx:/data/backup/log]# ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock [root@xxxxxxx ...

  7. day1作业二:多级菜单操作(函数实现)

    作业二:多级菜单 (1)三级菜单 (2)可以次选择进入各子菜单 (3)所需新知识点:列表.字典 要求:输入back返回上一层,输入quit退出整个程序 本示例的三级菜单是一个yaml文件格式,格式如下 ...

  8. MVC图片上传并显示缩略图

    前面已经说了怎么通过MVC来上传文件,那么这次就说说如何上传图片然后显示缩略图,这个的实用性还是比较大.用UpLoad文件夹来保存上传的图片,而Temp文件夹来保存缩略图,前面文件上传部分就不再重复了 ...

  9. Rookey.Frame之DAL工厂

    昨天给大家介绍了表单验证功能,今天给大家介绍下Rookey.Frame框架的数据层工厂,由于Rookey.Frame框架ORM是基于servicestack.ormlite,很多朋友反映这个网上中文资 ...

  10. 关于 eclipse启动卡死的问题 解决方法

    关于 eclipse启动卡死的问题(eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法),自己常用的解决方法: 方案一(推荐使用,如果没有这个文件,就使用方案二): 到<works ...