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. CF529B 【Group Photo 2 (online mirror version)】

    贪心枚举最后方案中最大的h,设为maxh若某个人i的wi与hi均大于maxh,则此方案不可行若某个人恰有一个属性大于maxh,则可确定他是否换属性剩下的人按wi-hi从大到小排序后贪心选择O(nlog ...

  2. python图片处理(三)

    ji那天用到了python图片处理中的二值图像的骨架提取,在matlab中通过输入图像的二值,来处理得到图像的骨架, skelimage = bwmorph(im, 'skel', inf); 在ma ...

  3. (一)问候 HtmlUnit

    第一节: HtmlUnit 简介 htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实 ...

  4. 1、树莓派3B开箱+安装系统

    说白了,树莓派就是英国人为学生开发的一款微型电脑.电脑能干什么,那就多了.英国小学生有用树莓派做气象站的,有检测家长开门回家的(可以安心玩游戏了),总之脑洞有多大就可以玩多大. 了解到了之后就一直心水 ...

  5. 出现丢包解决方法(ping: sendmsg: Operation not permitted)

    故障排查: 早上突然收到nagios服务器check_icmp的报警,报警显示一台网站服务器的内网网络有问题.因为那台服务器挂载了内网的NFS,因此内网的网络就采用nagios的check_icmp来 ...

  6. hdu 5078(2014鞍山现场赛 I题)

    数据 表示每次到达某个位置的坐标和时间 计算出每对相邻点之间转移的速度(两点间距离距离/相隔时间) 输出最大值 Sample Input252 1 9//t x y3 7 25 9 06 6 37 6 ...

  7. 【AtCoder】ARC096(C - F)

    听说日本题思维都很棒,去涨涨智商qwq C - Half and Half 题解 枚举买多少个AB披萨也行 但是关于买x个AB披萨最后的总花费是个单峰函数,可以三分 这题有点像六省联考2017D1T1 ...

  8. LoadRunner如何获得参数化中每个关键字的搜索响应时间

    LoadRunner如何获得参数化中每个关键字的搜索响应时间 在测试搜索引擎时我们一般采用大量的搜索关键字,有时有必要了解在并发访问的情况下每个关键字的响应时间,一般如果不对脚本进行处理的话你可以获得 ...

  9. hdu 5936 2016ccpc 杭州 - D

    数学题好难啊!!!! 最长长度不超过十位, 折半枚举... 题解 #include<bits/stdc++.h> #define LL long long #define fi first ...

  10. Redis和MySQL数据一致中出现的几种情况

    1. MySQL持久化数据,Redis只读数据 redis在启动之后,从数据库加载数据. 读请求: 不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取 写请求: 数据首先都写到数 ...