---恢复内容开始---

http://poj.org/problem?id=3322

题意:http://jandan.net/2008/01/24/bloxorz.html就是这个鬼游戏

我也是郁闷了,昨天就看到一道连连看的题目,今天就是这个游戏。都懵逼了。

思路:这个游戏的难度主要是在于它是第一个长方体,而不是一个正方体,不过是正方体也就不存在这个游戏了,所以我们要想办法来标记它。

我首先定义了这个长方体有三种状态。

对于第一种状态来说,它是的底面是一个正方形,四边都是一个长方形。

第二种状态,底面是一个竖直摆放的一个长方形。

第三种状态, 底面是一个水平摆放的一个长方形。

定义状态有利于对这个长方体进行操作。

定义状态后,我们要标记它是否通过某个点。

1我定义为在那个长方体在那个点是立起来的。也就是那个长方体与地面接触的点这有这个点

2我定义为这个点没有和这个点上面的那个点同时被占用。

3我定义为这个点没有和这个点右边的那个点同时被占用。

4我定义为这个点没有和这个店下面的那个点同时被占用。

5我定义为这个点没有和这个点左边的那个点同时被占用。

这样定义的话,你就可以判断这个长方体是不是第一次以这样的方式通过这个点。

同时被占用意思是这个长方体同时出现在这个点和相邻的那个点。

 #include <stdio.h>
#include <string.h>
#include <queue> using namespace std; char mp[][]; bool mark[][][]; struct note{
int x,y,state,step,x1,y1;
}p,tmp;
queue <note >q; int ex,ey,ex1,ey1,m,n,kind; //因为这个题目最开始我想错了,我是把O看成起点,X看成终点,所以我的搜索方向是反过来的,不过这个无所谓,因为从O到X和从X到O的最短路一定是一样的。 int bfs(int x,int y,int z)
{
p.x=x;
p.y=y;
p.state=z;
p.step=;
p.x1=x;
p.y1=y;
mark[p.x][p.y][]=false;
q.push(p);
while(!q.empty())
{
tmp=q.front();
q.pop();
if(kind==&&tmp.state==&&tmp.x==ex&&tmp.y==ey) { //这个是因为长方体可能不是立着放的,所以我反过来的话,那么它到达终点也有可能不是立着的。
return tmp.step;
}else {
if(tmp.x==ex&&tmp.x1==ex1&&tmp.y==ey&&tmp.y1==ey1)
return tmp.step;
}
if(tmp.state==){
if(mark[tmp.x+][tmp.y][]&&mp[tmp.x+][tmp.y]!='#'&&mp[tmp.x+][tmp.y]!='#'&&tmp.x<=m-){ //判断,它不能超过边界,mark[4]是因为,x+2是x+1在x+1的下面,所以判断一次这样的
走过没有,没走过就可以走一次,走过之后把X+1的mark[4]标记和x+2的mark[2]标记就可以了。
p.state=;
p.x=tmp.x+;
p.x1=tmp.x+;
p.step=tmp.step+;
p.y=tmp.y;
p.y1=tmp.y;
mark[tmp.x+][tmp.y][]=false;
mark[tmp.x+][tmp.y][]=false;
q.push(p);
}
if(mark[tmp.x-][tmp.y][]&&mp[tmp.x-][tmp.y]!='#'&&mp[tmp.x-][tmp.y]!='#'&&tmp.x>=){
p.state=;
p.x=tmp.x-;
p.x1=tmp.x-;
p.step=tmp.step+;
p.y=tmp.y;
p.y1=tmp.y;
mark[tmp.x-][tmp.y][]=false;
mark[tmp.x-][tmp.y][]=false;
q.push(p);
}
if(mark[tmp.x][tmp.y+][]&&mp[tmp.x][tmp.y+]!='#'&&mp[tmp.x][tmp.y+]!='#'&&tmp.y<=n-){
p.state=;
p.x=tmp.x;
p.x1=tmp.x;
p.step=tmp.step+;
p.y=tmp.y+;
p.y1=tmp.y+;
mark[tmp.x][tmp.y+][]=false;
mark[tmp.x][tmp.y+][]=false;
q.push(p);
}if(mark[tmp.x][tmp.y-][]&&mp[tmp.x][tmp.y-]!='#'&&mp[tmp.x][tmp.y-]!='#'&&tmp.y>=){
p.state=;
p.x=tmp.x;
p.x1=tmp.x;
p.step=tmp.step+;
p.y=tmp.y-;
p.y1=tmp.y-;
mark[tmp.x][tmp.y-][]=false;
mark[tmp.x][tmp.y-][]=false;
q.push(p);
}
}
if(tmp.state==){
if(mark[tmp.x-][tmp.y][]&&(mp[tmp.x-][tmp.y]=='.'||mp[tmp.x-][tmp.y]=='X')&&tmp.x->=){ //这个因为是立着放,所以下一个点只可以是‘.’不能是E
p.state=;
p.x=tmp.x-;
p.x1=tmp.x-;
p.step=tmp.step+;
p.y=tmp.y;
p.y1=tmp.y1;
mark[tmp.x-][tmp.y][]=false;
q.push(p);
}
if(mark[tmp.x1+][tmp.y][]&&(mp[tmp.x1+][tmp.y]=='.'||mp[tmp.x1+][tmp.y]=='X')&&tmp.x1+<=m){
p.state=;
p.x=tmp.x1+;
p.x1=tmp.x1+;
p.step=tmp.step+;
p.y=tmp.y;
p.y1=tmp.y1;
mark[tmp.x1+][tmp.y][]=false;
q.push(p);
}
if(mark[tmp.x][tmp.y-][]&&mp[tmp.x][tmp.y-]!='#'&&mp[tmp.x1][tmp.y-]!='#'&&tmp.y->=){
p.state=;
p.x=tmp.x;
p.x1=tmp.x1;
p.step=tmp.step+;
p.y=tmp.y-;
p.y1=tmp.y-;
mark[tmp.x][tmp.y-][]=false;
mark[tmp.x1][tmp.y-][]=false;
q.push(p);
}
if(mark[tmp.x][tmp.y+][]&&mp[tmp.x][tmp.y1+]!='#'&&mp[tmp.x1][tmp.y+]!='#'&&tmp.y+<=n){
p.state=;
p.x=tmp.x;
p.x1=tmp.x1;
p.step=tmp.step+;
p.y=tmp.y+;
p.y1=tmp.y1+;
mark[tmp.x][tmp.y+][]=false;
mark[tmp.x1][tmp.y+][]=false;
q.push(p);
}
}
if(tmp.state==)
{
if(mark[tmp.x-][tmp.y][]&&mp[tmp.x-][tmp.y]!='#'&&mp[tmp.x-][tmp.y1]!='#'&&tmp.x->=){
p.state=;
p.x=tmp.x-;
p.x1=tmp.x1-;
p.step=tmp.step+;
p.y=tmp.y;
p.y1=tmp.y1;
mark[tmp.x-][tmp.y][]=false;
mark[tmp.x-][tmp.y1][]=false;
q.push(p);
}
if(mark[tmp.x+][tmp.y][]&&mp[tmp.x+][tmp.y]!='#'&&mp[tmp.x+][tmp.y1]!='#'&&tmp.x1+<=m){
p.state=;
p.x=tmp.x1+;
p.x1=tmp.x1+;
p.step=tmp.step+;
p.y=tmp.y;
p.y1=tmp.y1;
mark[tmp.x+][tmp.y][]=false;
mark[tmp.x+][tmp.y1][]=false;
}
if(mark[tmp.x][tmp.y-][]&&(mp[tmp.x][tmp.y-]=='.'||mp[tmp.x][tmp.y-]=='X')&&tmp.y->=){
p.state=;
p.x=tmp.x;
p.x1=tmp.x1;
p.step=tmp.step+;
p.y=tmp.y-;
p.y1=tmp.y-;
mark[tmp.x][tmp.y-][]=false;
q.push(p);
}
if(mark[tmp.x][tmp.y1+][]&&(mp[tmp.x][tmp.y1+]=='.'||mp[tmp.x][tmp.y1+]=='X')&&tmp.y1+<=n){
p.state=;
p.x=tmp.x;
p.x1=tmp.x1;
p.step=tmp.step+;
p.y=tmp.y1+;
p.y1=tmp.y1+;
mark[tmp.x][tmp.y1+][]=false;
q.push(p);
}
}
} return ;
} int main()
{
int x,y;
while(scanf("%d%d",&m,&n),m||n)
{
memset(mark,true,sizeof(mark));
memset(mp,,sizeof(mp));
getchar();
kind=;
for(int i=;i<=m;i++){
for(int j=;j<=n;j++)
{
scanf("%c",&mp[i][j]);
// printf("%c",mp[i][j]);
if(mp[i][j]=='O')
{
x=i,y=j;
}
if(mp[i][j]=='X')
{
if(kind==){ ex=i;ey=j;kind++;}
else {
ex1=i;ey1=j;kind++;
}
}
}
getchar();
}
while(!q.empty())
q.pop();
int ans=bfs(x,y,);
if(ans!=) printf("%d\n",ans);
else printf("Impossible\n");
}
return ;
}

POJ 3322(广搜)的更多相关文章

  1. poj 1184 广搜进阶题

    起初的想法果然就是一个6000000的状态的表示. 但是后面觉得还是太过于幼稚了. 可以看看网上的解释,其实就是先转换位置,然后再改变数字的大小. #include<iostream> # ...

  2. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  3. 广搜+打表 POJ 1426 Find The Multiple

    POJ 1426   Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25734   Ac ...

  4. POJ 3984 迷宫问题 记录路径的广搜

    主要是学一下如何在广搜中记录路径:每找到一个点我就记录下这个点是由那个点得来的,这样我找到最后个点后,我就可以通过回溯得到我走过的路径,具体看代码吧~ #include<cstdio> # ...

  5. 广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=85 http://poj.org/problem?id=1130 这 ...

  6. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  7. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  8. poj 3026 Borg Maze 最小生成树 + 广搜

    点击打开链接 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7097   Accepted: 2389 ...

  9. POJ 2251 Dungeon Master(广搜,三维,简单)

    题目 简单的3d广搜,做法类似与 hdu 的 胜利大逃亡 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<str ...

随机推荐

  1. Yii2 高级版新建一个 Api 应用

    原文地址:http://www.getyii.com/topic/28 先在项目的根目录下复制一份 backend 为 api: cp backend/ api -r 拷贝 api 环境 cp -a ...

  2. IIS站点无法访问..点浏览IIS窗口直接关掉

    呃..其实这个问题很简单.. 大家可以先看这位大婶写的博文.. http://blog.csdn.net/chenguang79/article/details/7220232 如果网站一访问IIS就 ...

  3. jQuery -- is() 方法

    定义和用法: 根据选择器.DOM元素或 jQuery 对象来检测匹配元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true.如果没有元素符合,或者表达式无效,都返回'false'. ''' ...

  4. 浅谈JavaScript中的继承

    引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...

  5. Owin是什么?

    OWIN的英文全称是Open Web Interface for .NET. 如果仅从名称上解析,可以得出这样的信息:OWIN是针对.NET平台的开放Web接口. 那Web接口是谁和谁之间的接口呢?是 ...

  6. 使用微信JS-SDK调用微信浏览器的接口

    先附上微信公众平台的相关链接: 微信公众平台:https://mp.weixin.qq.com/ 微信公众平台开发文档:https://mp.weixin.qq.com/wiki 微信公众平台JS-S ...

  7. 使用MVVM框架(avalonJS)进行快速开发

    背景 在运营活动开发中,因为工作的重复性很大,同时往往开发时间短,某些情况下也会非常紧急,导致了活动开发时间被大大压缩,同时有些活动逻辑复杂,数据或者状态变更都需要手动渲染,容易出错,正是因为这些问题 ...

  8. Nginx 502 bad gateway问题的解决方法

    Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,一般来说Nginx 502 Bad G ...

  9. 电脑开机黑屏,显示Reboot and Select proper boot device!

    “reboot and select proper boot device or insert boot media in selected boot device and press a key” ...

  10. codevs5164 逆波兰表达式

    题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...