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后面,可 ...
随机推荐
- mysql 查询格式化时间
select DATE_FORMAT(addtime,'$m %d %Y') from tablename 输出:01 28 2019 数据库时间格式:2019-01-28 15:01:20
- [Vijos P2000]A x B Problem
题目大意:叫你求A × B. 解题思路:高精度.你可千万别小看这道题,这是2017年7月27日的信息. 不过也不要怕,根据twd2的题解里写的,用普通的高精度加上一些小小的修改是可以过的. 那么直接上 ...
- vue单文件中引用路径的处理
原文地址:vue单文件中引用路径的处理如有错误,欢迎指正! vue单文件的开发过程中,在单文件模版中可能会涉及到文件路径的处理,比如 <img>, style 中的 background ...
- 紫书 习题 8-16 UVa 1618 (中途相遇法)
暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断. 一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn) (1)两种比较方式是相 ...
- Camera Calibration 相机标定:原理简介(二)
2 针孔相机模型 常见的相机标定中,使用的相机多为针孔相机(Pinhole camera),也就是大家熟知的小孔成像理论.将其中涉及的坐标系之间的相互转换抽离出来,即为针孔相机模型的核心. 上图所示的 ...
- Fragmen直接来回切换deno
思路: 第一步.建立一个activity.用来管理fragment. 第二步'获取fragmentManger 和fragmentTraction. private FragmentManager f ...
- linux线程间同步(1)读写锁
读写锁比mutex有更高的适用性,能够多个线程同一时候占用读模式的读写锁.可是仅仅能一个线程占用写模式的读写锁. 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,全部试图对这个锁加锁的线程都会被堵塞 ...
- new,malloc,GlobalAlloc具体解释
WINDOWS下最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是栈,而是直接在进程的地址空间中保留一快内存.尽管用起来最不方便. 可是速度快,也最灵活 new,malloc,Glob ...
- delphi网络函数大全
{=========================================================================功 能: 网络函数库时 间: 2002/10/02版 ...
- bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)
1009: [HNOI2008]GT考试 题目:传送门 题解: 看这第一眼是不是瞬间想起组合数学??? 没错...这样想你就GG了! 其实这是一道稍有隐藏的矩阵乘法,好题! 首先我们可以简化一下题意: ...