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后面,可 ...
随机推荐
- POJ-3348 Cows 计算几何 求凸包 求多边形面积
题目链接:https://cn.vjudge.net/problem/POJ-3348 题意 啊模版题啊 求凸包的面积,除50即可 思路 求凸包的面积,除50即可 提交过程 AC 代码 #includ ...
- LOJ #10121 与众不同 (RMQ+二分)
题目大意 :给你一个整数序列,定义一个合法子串为子串内所有数互不相同,会有很多询问,求区间$[L,R]$内最长连续合法子串长度 一道思维不错的$RMQ$题,NOIP要是考这种题可能会考挂一片 预处理出 ...
- PageUtil
package cn.com.qmhd.oto.common; import java.io.Serializable; import java.util.List; import org.sprin ...
- LAMP环境搭建备忘 -- Apache、pHp 安装 (二)
上一篇 Linux 已经安装好了,我们选择了 CentOS 7 的最小化安装,即没有图形界面,并且我们在安装时设置了网络连接即能够连上外部网络,还设置了 root 密码.下面我们要在此基础上继续安装 ...
- 让div垂直居中
参考链接:https://www.cnblogs.com/softwarefang/p/6095806.html 以前我的方法总是比较粗暴,纯粹通过margin来实现,这个方法的缺点不仅在于需要多次微 ...
- 如何配置任意目录下Web应用程序
1,首先创建一个Web项目,tomcat 7, JDK 1.8 2,创建Web项目并部署到tomcat服务器下运行的步骤和方法: 在Eclipse下创建一个JAVA project 在JAVA项目下创 ...
- root用户无法切换到cdh的hive账号上
在/etc/passwd中看到hive账号是登录的终端是/bin/false,而正常的用户配置的都是/bin/bash,因此在root账号su到hive也是没有用的 hive:x:111:111:Hi ...
- 今天遇到的一个诡异的core和解决 std::sort
其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题. 今天把所有代码挪到了as这里,没想到又出core了. 根据直觉,我就觉得可能是std::sort这边的问题. 上网一搜, ...
- POJ--1966--Cable TV Network【无向图顶点连通度】
链接:http://poj.org/problem?id=1966 题意:一个无向图,n个点,m条边,求此图的顶点连通度. 思路:顶点连通度,即最小割点集里的割点数目.一般求无向图顶点连通度的方法是转 ...
- Java IO(二) 之 InputStream
源代码均以JDK1.8作为參考 前言: InputStream实现了两个接口Closeable和AutoCloseable: Closeable:JDK1.5中引入,Closeable接口中仅仅有一个 ...