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

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. Python之路【第四篇】:模块

    什么是模块: 模块就是一个功能的集合. 模块就和乐高积木差不多,你用这些模块组合出一个模型,然后也可以用这个模块加上其他的模块组合成一个新的模型 模块的种类: 1.内置模块(python自带的比如os ...

  2. PHP7的安装

    PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂 ...

  3. 浅谈T-SQL中的联接查询

    引言 平时开发时,经常会使用数据库进行增删改查,免不了会涉及多表联接.今天就简单的记录下T-SQL下的联接操作. 联接类型及其介绍 在T-SQL中联接操作使用的是JOIN表运算符.联接有三种基本的类型 ...

  4. Eclipse闪退无法打开的解决方法

    使用Eclipse过程中但是有时会出现打不开闪退的情况,这是为什么呢,遇到这种情况怎么解决.东坡小编通过查找资料,发现如下方法可以解决eclipse打不开闪退,具体操作如下: Eclipse打不开闪退 ...

  5. POJ 2411 Mondriaan&#39;s Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  6. java实现文件单词频率统计 topN top K

    java 实现单词计数.top N 思路 先统计每个单词出现的个数 利用 TreeSet 的自动排序的功能 上代码 wordcount public void wordCount() { String ...

  7. 修改Ubuntu12.04 左侧启动器Launcher图标大小,以及如何隐藏启动器?

    在 VirtualBox 中安装了 Ubuntu 12,一直使用 2D 桌面,3D桌面没用上,估计是电脑配置低的问题. 左边启动器的图标特别大,占据了很多的桌面空间,打算调小点.奇怪的是,在“系统设置 ...

  8. java之String

    一.构造器 package com.string; import java.io.UnsupportedEncodingException; import java.nio.charset.Chars ...

  9. springMVC之国际化

    1.工程结构 2.jar包 3.配置文件spring-config.xml,springMVC配置文件 <?xml version="1.0" encoding=" ...

  10. java web 相对路径中已/开头和不已/开头的区别

    通俗的讲,有/会从跟目录开始算,没有会从当前目录开始算 1.前台页面 ​页面中向服务器页面请求静态资源且没有指定<base href="<%=basePath%>" ...