Bloxorz I (poj 3322 水bfs)
|
Language:
Default
Bloxorz I
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,
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 It guarantees that
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 Sample Output 10 Source
POJ Monthly--2007.08.05, Rainer
|
题意就不详细说了,去这里玩一下就知道了戳我玩游戏。还是非常好玩的~
思路:Move函数写得非常蛋疼,我是硬来的,一定要细心。
代码:
#include <iostream>
#include <functional>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std; #define INF 0x3f3f3f3f
#define mod 1000000009
const int maxn = 550;
const int MAXN = 2005;
const int MAXM = 200010;
const int N = 1005; struct Node
{
int state; //0表示立着 1表示横着 2表示竖着
int x1,y1,x2,y2;
int step;
}; int n,m;
int ex,ey;
char mp[maxn][maxn];
int dir[4][2]={0,-1,0,1,-1,0,1,0};
bool vis[3][maxn][maxn];
int pos[5]; bool isok(int x,int y)
{
if (x>=0&&x<n&&y>=0&&y<m&&mp[x][y]!='#') return true;
return false;
} bool Move(int x,int y,int d,Node &now)
{
if (now.state==0)
{
now.x1=x+dir[d][0]; now.y1=y+dir[d][1];
now.x2=x+2*dir[d][0]; now.y2=y+2*dir[d][1];
if (d==0||d==2) { //始终保持横着的左边一个为主块。竖着的上面一个为主块
swap(now.x1,now.x2);
swap(now.y1,now.y2);
}
if (d<2) now.state=1;
else now.state=2;
if (isok(now.x1,now.y1)&&isok(now.x2,now.y2)&&!vis[now.state][now.x1][now.y1])
return true;
}
else if (now.state==1)
{
if (d<2){
now.x1=x+dir[d][0]; now.y1=y+dir[d][1];
if (d==1) now.x1=now.x1+dir[d][0] , now.y1=now.y1+dir[d][1];
now.state=0;
if (isok(now.x1,now.y1)&&mp[now.x1][now.y1]!='E'&&!vis[now.state][now.x1][now.y1])
return true;
}
else
{
now.x1=x+dir[d][0]; now.y1=y+dir[d][1];
now.x2=now.x1; now.y2=now.y1+1;
if (isok(now.x1,now.y1)&&isok(now.x2,now.y2)&&!vis[now.state][now.x1][now.y1])
return true;
}
}
else
{
if (d>1){
now.x1=x+dir[d][0]; now.y1=y+dir[d][1];
if (d==3) now.x1=now.x1+dir[d][0] , now.y1=now.y1+dir[d][1];
now.state=0;
if (isok(now.x1,now.y1)&&mp[now.x1][now.y1]!='E'&&!vis[now.state][now.x1][now.y1])
return true;
}
else
{
now.x1=x+dir[d][0]; now.y1=y+dir[d][1];
now.x2=now.x1+1; now.y2=now.y1;
if (isok(now.x1,now.y1)&&isok(now.x2,now.y2)&&!vis[now.state][now.x1][now.y1])
return true;
}
}
return false;
} int bfs(int nn)
{
Node st,now;
memset(vis,false,sizeof(vis));
if (nn<3)
{
st.x1=pos[0];
st.y1=pos[1];
st.state=0;
}
else
{
st.x1=pos[0]; st.y1=pos[1];
st.x2=pos[2]; st.y2=pos[3];
if (st.x1==st.x2) st.state=1;
else st.state=2;
}
st.step=0;
vis[st.state][st.x1][st.y1]=true;
queue<Node>Q;
Q.push(st);
while (!Q.empty())
{
st=Q.front();Q.pop();
if (st.state==0&&st.x1==ex&&st.y1==ey)
return st.step;
// printf("\n");
// printf("=====================\n");
for (int i=0;i<4;i++)
{
now.state=st.state;
if (Move(st.x1,st.y1,i,now))
{
// printf("%d %d %d \n",now.state,now.x1,now.y1);
vis[now.state][now.x1][now.y1]=true;
now.step=st.step+1;
Q.push(now);
}
}
}
return -1;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);
#endif
int i,j,num;
while (scanf("%d%d",&n,&m))
{
if (n==0&&m==0) break;
num=0;
for (i=0;i<n;i++)
{
scanf("%s",mp[i]);
for (j=0;j<m;j++)
{
if (mp[i][j]=='X')
{
pos[num++]=i;
pos[num++]=j;
}
if (mp[i][j]=='O')
{
ex=i;ey=j;
}
}
}
int ans=bfs(num);
if (ans==-1) printf("Impossible\n");
else printf("%d\n",ans);
}
return 0;
}
Bloxorz I (poj 3322 水bfs)的更多相关文章
- Bloxorz I POJ - 3322 (bfs)
Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which m ...
- 【POJ 3322】 Bloxorz I
[题目链接] http://poj.org/problem?id=3322 [算法] 广度优先搜索 [代码] #include <algorithm> #include <bitse ...
- POJ 2252 Dungeon Master 三维水bfs
题目: http://poj.org/problem?id=2251 #include <stdio.h> #include <string.h> #include <q ...
- POJ 3322 Bloxorz I
首先呢 这个题目的名字好啊 ORZ啊 如果看不懂题意的话 请戳这里 玩儿几盘就懂了[微笑] http://www.albinoblacksheep.com/games/bloxorz 就是这个神奇的木 ...
- POJ 3322 Bloxorz(算竞进阶习题)
bfs 标准广搜题,主要是把每一步可能的坐标都先预处理出来,会好写很多 每个状态对应三个限制条件,x坐标.y坐标.lie=0表示直立在(x,y),lie=1表示横着躺,左半边在(x,y),lie=2表 ...
- POJ 3322 Bloxorz
#include<cstring> #include<algorithm> #include<iostream> #include<cstdio> #i ...
- POJ 3322(广搜)
---恢复内容开始--- http://poj.org/problem?id=3322 题意:http://jandan.net/2008/01/24/bloxorz.html就是这个鬼游戏 我也是郁 ...
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- POJ 3026(BFS+prim)
http://poj.org/problem?id=3026 题意:任意两个字母可以连线,求把所有字母串联起来和最小. 很明显这就是一个最小生成树,不过这个题有毒.他的输入有问题.在输入m和N后面,可 ...
随机推荐
- Mateclass
Mateclass 一切皆对象: Eg: class Foo: pass f=Foo() In [60]: print(type(f)) <class '__main__.Foo'> In ...
- 拉格朗日插值&&快速插值
拉格朗日插值 插值真惨 众所周知$k+1$个点可以确定一个$k$次多项式,那么插值就是通过点值还原多项式的过程. 设给出的$k+1$个点分别是$(x_0,y_0),(x_1,y_1),...,(x_k ...
- 51nod 1526 分配笔名(Trie树+贪心)
建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...
- csv 模块的基本使用
csv 模块专门用于读取和写入 csv 文件内容 以下主要讲在 python2 中的使用,在python3中有不同的地方,我会单独指出来 一般的excel表格可以保存为csv格式,然后就可以使用 cs ...
- c++_benchMark_vector_list_deque
title: c++_benchMark_vector_list_deque date: 2015-08-01 22:32:39 作者:titer1 + ZhangYu 出处:www.drysalte ...
- groovy : poi 导出 Excel xlsx
參考 file:///poi-3.10-FINAL/docs/spreadsheet/how-to.html#sxssf text2xlsx.groovy 代码例如以下 package xlsx; i ...
- Cubieboard学习资源
1.Cubieboard2学习系列学习教程. 2.Cubieboard安装server成功,ssh远程登录. 3.CubieBoard2 A20学习笔记. 4.一个学习CubieTruck的站点. 5 ...
- swift 给导航添加item,实现界面的跳转
//给导航添加item var rightItem = UIBarButtonItem(title: "First", style: UIBarButtonItem ...
- spfile
1 让ORACLE自己主动从spfile启动 SQL> create spfile='/dev/vx/rdsk/vgora/lv_spfile' from pfile; SQL> sh ...
- UTF8有很明显的特征:如果最高字节为0,则表示一个英文字符(与ASCII完全相同)。如果有2个以上1,表示是首个字节。如果最高位是10,则表示一个中间字节。
摘自<Qt中的C++技术.pdf> page 33