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

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. Zabbix 3.0 安装笔记

    Zabbix 3.0 只支持CentOS 7.0以上版本,所以先在虚拟机中安装好CentOS 7.0 x64,并设置好IP,允许虚拟机联网. 1.安装MySQL 从最新版本的linux系统开始,默认的 ...

  2. Yii2 打印sql语句和批量插入数据

    打印sql语句: $model->find()->createCommand()->getRawSql(); 批量插入 Yii::$app->db->createComm ...

  3. array_map与array_column之间的关系

    /*|----------------------------------------------------------|array_map();将回调函数作用到给定数组的单元上|array_col ...

  4. apt-get方式安装lnmp环境

    安装nginxsudo apt-get install nginx安装php和mysqlsudo apt-get install php5-cli php5-cgi php5-curl php5-my ...

  5. linuxMint install shuruma

    http://my.oschina.net/u/1446273/blog/306053 http://blog.sina.com.cn/s/blog_5d406a1b0101jlgn.html htt ...

  6. jQuery的$.ajax示例

    $.ajax({ url: 'index.php?module=products&submod=product_experience_manage&method=ajaxGetSele ...

  7. LoadRunner脚本编写(转)

    性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员 ...

  8. hash-4.hashtable

    1.先看hashtable的源代码 public synchronized V put(K key, V value) { // Make sure the value is not null if ...

  9. COM中的REFIID小解【转】

    是在浏览器项目中的IDispatch调用QueryInterface( [in]   REFIID riid,  [out]  void **ppvObject); 认识的REFIID,由于看声明说r ...

  10. cocos2dx中CC_CALLBACK_1等宏中this指针实际指向

    首先看代码,我在Helloworld中添加两个函数. void HelloWorld::addTarget(){ Size visibleSize = Director::getInstance()- ...