POJ 3322(广搜)
---恢复内容开始---
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(广搜)的更多相关文章
- poj 1184 广搜进阶题
起初的想法果然就是一个6000000的状态的表示. 但是后面觉得还是太过于幼稚了. 可以看看网上的解释,其实就是先转换位置,然后再改变数字的大小. #include<iostream> # ...
- 双向广搜 POJ 3126 Prime Path
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
- 广搜+打表 POJ 1426 Find The Multiple
POJ 1426 Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25734 Ac ...
- POJ 3984 迷宫问题 记录路径的广搜
主要是学一下如何在广搜中记录路径:每找到一个点我就记录下这个点是由那个点得来的,这样我找到最后个点后,我就可以通过回溯得到我走过的路径,具体看代码吧~ #include<cstdio> # ...
- 广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=85 http://poj.org/problem?id=1130 这 ...
- poj 3984:迷宫问题(广搜,入门题)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
- poj 3278:Catch That Cow(简单一维广搜)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 45648 Accepted: 14310 ...
- poj 3026 Borg Maze 最小生成树 + 广搜
点击打开链接 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7097 Accepted: 2389 ...
- POJ 2251 Dungeon Master(广搜,三维,简单)
题目 简单的3d广搜,做法类似与 hdu 的 胜利大逃亡 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<str ...
随机推荐
- OC-Q&A
How to declare a string in Objective-C ? A C string is just like in C. char myCString[] = "test ...
- hibernate4中取得connection的方法
在hibernate3中,使用了c3p0连接池,尝试了多种办法取得connection对象,以下两种可以使用. Java代码 Connection conn; // 方法1:hibernate4中将 ...
- JQuery中==与===、$("#")与$("")的区别
首先,== equality 等同,=== identity 恒等.==, 两边值类型不同的时候,要先进行类型转换,再比较.===,不做类型转换,类型不同的一定不等. 下面分别说明:先说 ===,这个 ...
- Cannot install NodeJs: /usr/bin/env: node: No such file or directory
安装doxmate时,doxmate地址是:https://github.com/JacksonTian/doxmatenpm install doxmate -g 安装完后把错误:Cannot in ...
- Express开发实例(1) —— Hello,world!
Express是NodeJs开发中最常用的基础模块.NodeJs本身有Http模块,但是易用性并不好,因此有人在此基础上开发了Express模块. 什么是express express提供了丰富的路由 ...
- 数据库左连接left join、右连接right join、内连接inner join on 及 where条件查询的区别
join on 与 where 条件的执行先后顺序: join on 条件先执行,where条件后执行:join on的条件在连接表时过滤,而where则是在生成中间表后对临时表过滤 left joi ...
- 小明系列问题――小明序列(LIS)
小明系列问题――小明序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- Linux/CentOS配置:使用yum update更新时不升级内核的方法
RedHat/CentOS/Fedora使用 yum update 更新时,默认会升级内核.但有些服务器硬件(特别是组装的机器)在升级内核后,新的内核可能会认不出某些硬件,要重新安装驱动,很麻烦.所以 ...
- MFC线程内操作主窗体 控件
CWnd* h_d2 = AfxGetApp()->GetMainWnd(); //获取主窗口的句柄 h_d2-> GetDlgItem(IDC_EDIT2)->GetWindowT ...
- C#画表格
下面给一个简单的例子,至于多个单元格合并,请自己去实现,也就是坐标计算的事情. 至于画图,用GDI,还是DirectX画,自己选择,不过这里主要讲的是算法:坐标计算以及画的过程. 注意不要每个列都画一 ...