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 ...
随机推荐
- EF: Raw SQL Queries
Raw SQL Queries Entity Framework allows you to query using LINQ with your entity classes. However, t ...
- CSV文件的读取 导出
CSV文件是 逗号分隔值文件 内容基本是这么存的... 姓名,年龄,性别/r/n王有才,,男/r/n王二妞,,女 一行值内用逗号 , 分开 行与行之间用 /r/n 分隔 说白了,他其实是一个字符 ...
- Mongodb 资源
一.资源 1.C# 驱动下载地址 https://github.com/mongodb/mongo-csharp-driver/releases 2. Mongodb 管理工具 mongochef 下 ...
- editplus中使用emmet?
要用emmet生成html类型, 格式是: html:???, 意思是 都是html大类型, 小类型用冒号. 如:html:5, 或者全部都是! 则生成html5的类型文档. emmet是zen co ...
- LINUX 命令行编辑快捷键
转自:http://www.cnblogs.com/edwardlost/archive/2012/07/27/2611536.html 删除 ctrl + d 删除光标所在位置上的字符相当于VIM里 ...
- C# 在字符串指定位置之前插入新的字符串
http://zhidao.baidu.com/link?url=XbU4souNCiDk9AbdYWMDj6VMO7AxlnIpcEnAy4JgfaZXxlpjVt2cEoL6GPO9B0WytMq ...
- Extjs3 + swfUpload实现多文件上传控件
要在ExrtJS框架实现选择多文件上传,FileUploadField已经无法满足需求,所以采用了 swfUpload上传控件,上传窗口如下: 多选文件进行上传(其实是每个文件异步上传),可以中途停止 ...
- C#中的抽象方法和虚方法有什么区别?
抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖.重写的子类虚函数就是被覆盖了.
- VPN添加静态路由表(指定程序或资源走VPN)
在某此情况下,我们希望为VPN客户端指定线路,比如只有公司的资源或网站才使用VPN连接,其它的网络请求依然走他们自己的默认网关. 这种情况下,我们就需要给VPN客户端添加静态路由规则并取消VPN连接的 ...
- GCD与NSOperationQueue
1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装 2> GCD只支持FIFO(先入先出)的队列,NSOperationQueue可以很方便地调整执 ...