poj3322 Bloxorz I
| Home | Problems | Logout |
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
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的更多相关文章
- POJ3322 Bloxorz I 无脑广搜(我死了。。。)
多测不清空,爆零两行泪....我死了QWQ 每个节点3个状态:横坐标,纵坐标,和方向 说一下方向:0:立着,1:竖着躺着,上半部分在(x,y),2:横着躺着,左半部分在(x,y) 然后就有了常量数组: ...
- POJ3322Bloxorz I
POJ3322 Bloxorz I 暴搜,next数组与处理一下(小技巧) #include <cstdio> #include <iostream> #include < ...
- Bloxorz I (poj3322) (BFS)
[题目描述] It's a game about rolling a box to a specific position on a special plane. Precisely, the pla ...
- Bloxorz I POJ - 3322 (bfs)
Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which m ...
- 寒假训练——搜索 E - Bloxorz I
Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which m ...
- POJ 3322 Bloxorz I
首先呢 这个题目的名字好啊 ORZ啊 如果看不懂题意的话 请戳这里 玩儿几盘就懂了[微笑] http://www.albinoblacksheep.com/games/bloxorz 就是这个神奇的木 ...
- Bloxorz I (poj 3322 水bfs)
Language: Default Bloxorz I Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5443 Acce ...
- POJ 3322 Bloxorz(算竞进阶习题)
bfs 标准广搜题,主要是把每一步可能的坐标都先预处理出来,会好写很多 每个状态对应三个限制条件,x坐标.y坐标.lie=0表示直立在(x,y),lie=1表示横着躺,左半边在(x,y),lie=2表 ...
- 【POJ 3322】 Bloxorz I
[题目链接] http://poj.org/problem?id=3322 [算法] 广度优先搜索 [代码] #include <algorithm> #include <bitse ...
随机推荐
- Python 文件IO
Python 文件I/O 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下: #!/u ...
- python dict交换key value值
方法一: 使用dict.items()方式 dict_ori = {'A':1, 'B':2, 'C':3} dict_new = {value:key for key,value in dict_o ...
- php读取xml中cdata部分方法
本例使用php的simplexml:XML(eventtrackdata.xml'): <eventdata> <event> <date>2012.05.11&l ...
- 插头DP学习笔记——从入门到……????
我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该 ...
- LoadRunner中的随机数
LoadRunner中的随机数 Action() { int i; ]; srand(time(NULL)); i=rand()%; lr_save_datetime("%m%d%H%M%S ...
- 6-14 Inspector s Dilemma uva12118(欧拉道路)
题意:给出一个国家城市个数n 所需走过道路个数e 每条道路长t 该国家任意两个城市之间都存在唯一道路长t 要求 :找一条最短的路遍历所有所需走过的路 一开始以为是图的匹配 但是好 ...
- 2017-2018-1 20179202《Linux内核原理与分析》第九周作业
进程的切换和系统的一般执行过程 1.知识总结 (1)进程调度的时机: 中断处理过程直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(). 内核线程是一 ...
- Android与GPL、BSD和Apache之间的关系
参考资料 Android ,在争议中逃离 Linux 内核的 GPL 约束 | 爱范儿 简介 众所周知,Linux内核基于GPL v2发行.GPL规定,基于GPL的软件产品的衍生产品,也必须使用GPL ...
- 使用GIT进行源码管理——GUI客户端
很多人对GIT GUI客户端是非常不屑一顾的,但我非常喜欢GUI的方便快捷,也不用记忆冗杂的命令,本文简单的介绍了几种免费的Windows下的GIT客户端,方便大家使用. Git for Window ...
- 为什么Java7开始在数字中使用下划线
JDK1.7的发布已经介绍了一些有用的特征,尽管大部分都是一些语法糖,但仍然极大地提高了代码的可读性和质量.其中的一个特征是介绍字面常量数字的下划线.从Java7开始,你就可以在你的Java代码里把长 ...