题意:地图上分别用‘.’表示硬地,‘#’表示禁地,‘E’表示易碎地面。你的任务操作一个1*1*2的长方体。长方体有两种状态分别为:立在地面上,躺在地面上。把长方体从入口移动到出口,求需要的最小步数。

原题链接:http://poj.org/problem?id=3322

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std; struct node{
int x;
int y;
int lie; //lie=0,代表竖着;lie=1,代表横着躺着;lie=2,代表垂直躺着
}; char map[][];
int r,c;//r表示地图的行数,c表示地图的列数
node start,end; //记录起点和终点的状态
int dx[]={-,,,};//表示左右方向的移动
int dy[]={,,,-};//表示上下方向的移动
int dis[][][];//记录起点走到x,y时候,状态为lie的路径长度 void init()
{
for(int i=;i<=r;i++)
{
for(int j=;j<=c;j++)
{
for(int k=;k<;k++)
{
dis[i][j][k]=-;
}
}
}
} bool judge(int x,int y)
{
if(x<=r&&x>=&&y<=c&&y>=)
{
return true;
}
return false;
} bool judge_stay(node n)//判断一个长方体呆着是否合理
{
if(!judge(n.x,n.y))
return ;
if(map[n.x][n.y]=='#')
return ;
if(n.lie==&&map[n.x][n.y]!='.')
return ;
if(n.lie==&&(map[n.x][n.y+]=='#'))
return ;
if(n.lie==&&(map[n.x+][n.y]=='#'))
return ;
return ;
}
/*
int dx_lie0[4]={0,0,-2,1};//lie=0的时候,向四个方向运动时,x的变化。 左右上下
int dy_lie0[4]={-2,1,0,0};//lie=0的时候,向四个方向运动时,y的变化。
int dx_lie1[4]={0,0,-1,1};
int dy_lie1[4]={-1,2,0,0};
int dx_lie2[4]={0,0,-1,2};
int dy_lie2[4]={-1,1,0,0};
*/ int dx_lie[][]={,,-,,,,-,,,,-,};
int dy_lie[][]={-,,,,-,,,,-,,,};
int lie[][]={,,,,,,,,,,,};//lie[i][j]表示状态为i的时候,向j方向反转后,lie的状态 int bfs()
{
queue<node>q;
while(!q.empty())
{
q.pop();
}
q.push(start);
dis[start.x][start.y][start.lie]=;
while(!q.empty())
{
node t=q.front();
q.pop();
for(int k=;k<;k++)
{
node next;
next.x=t.x+dx_lie[t.lie][k];
next.y=t.y+dy_lie[t.lie][k];
next.lie=lie[t.lie][k];
if(judge_stay(next))
{
if(dis[next.x][next.y][next.lie]==-)
{
//cout<<t.x<<' '<<t.y<<' '<<t.lie<<endl;
//cout<<"x"<<next.x<<endl;
//cout<<"y"<<next.y<<endl;
//cout<<"lie"<<next.lie<<endl; q.push(next);
dis[next.x][next.y][next.lie]=dis[t.x][t.y][t.lie]+;
//cout<<endl<<"x"<<next.x<<" y"<<next.y<<" lie"<<next.lie<<" dis"<<dis[next.x][next.y][next.lie];
//cout<<endl<<endl;
if(next.x==end.x&&next.y==end.y&&next.lie==end.lie)
{
return dis[next.x][next.y][next.lie];
}
}
}
}
}
return -;
} void fun_st_ed() //处理起点和终点
{
for(int i=;i<=r;i++)
{
for(int j=;j<=c;j++)
{
if(map[i][j]=='O')
{
end.x=i;
end.y=j;
end.lie=;
map[i][j]='.';
}
if(map[i][j]=='X')
{
for(int k=;k<;k++)
{
int next_x=i+dx[k];
int next_y=j+dy[k];
if(judge(next_x,next_y)&&map[next_x][next_y]=='X')
{
start.x=min(i,next_x);
start.y=min(j,next_y);
start.lie=k<?:;//k<2的时候说明是上下有连着的X,k>2说明左右有连着的X;
map[i][j]='.';
map[next_x][next_y]='.';
}
}
}
if(map[i][j]=='X')//说明周围四个点当中没有X。
{
//cout<<"i"<<i<<"j"<<j<<endl;
start.x=i;
start.y=j;
start.lie=;
map[i][j]='.';
}
}
}
} int main()
{
while(cin>>r>>c)
{
if(r==&&c==)
{
break;
}
memset(map,,sizeof(map));
for(int i=;i<=r;i++)
{
//for(int j=1;j<=c;j++)
//{
//cin>>map[i][j];
scanf("%s",map[i]+);
//}
//getchar();
}
init();
fun_st_ed();
//cout<<start.x<<start.y<<start.lie<<endl;
int ans=bfs();
if(ans==-)
{
cout<<"Impossible"<<endl;
}
else
{
cout<<ans<<endl;
}
}
return ;
} /*
7 7
#######
#...X##
#..##O#
#....E#
#....E#
#.....#
#######
*/

解题思路:用bfs求最短路径。用数组表示前状态和后状态的关系。用dis数组记录最短路径的长度。

bfs经典的更多相关文章

  1. BFS经典面试题——C++版

    文章目录 蛇梯棋 单词接龙 青蛙过河 蛇梯棋 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向. 例如,一块 6 x 6 大小的棋盘,编号 ...

  2. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  3. UVA1601-The Morning after Halloween(双向BFS)

    Problem UVA1601-The Morning after Halloween Accept: 289 Submit: 3136 Time Limit: 12000 mSec  Problem ...

  4. POJ - 3984 迷宫问题 BFS求具体路径坐标

    迷宫问题 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...

  5. 【tyvj】刷题记录(1001~1099)(64/99)

    1001:排序完按照题意做即可. #include<cstdio> #include<iostream> #include<cmath> #include<a ...

  6. 【洛谷P1443 马的遍历】

    题目链接(%%%jyy大佬) 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数 ...

  7. 别再埋头刷LeetCode之:北美算法面试的题目分类,按类型和规律刷题,事半功倍

    算法面试过程中,题目类型多,数量大.大家都不可避免的会在LeetCode上进行训练.但问题是,题目杂,而且已经超过1300道题. 全部刷完且掌握,不是一件容易的事情.那我们应该怎么办呢?找规律,总结才 ...

  8. AtCoder Beginner Contest 151 题解报告

    总的来说,这次的题目比较水,然而菜菜的我并没有把所有题目都做完,话不多说,直接来干货: A:Next Alphabet 题目链接:https://atcoder.jp/contests/abc151/ ...

  9. HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...

随机推荐

  1. Service-Level Agreement (服务水平协议)

    Service-Level Agreement (服务水平协议) SLA是为负载测试场景定义的具体目标.例如,评测脚本中任意数量事务的平均响应时间,可以定义具体的目标或阈值.测试运行结束之后,Load ...

  2. C#使用CefSharp碰到的坑(一)

    使用CEFSharp做模拟提交的话,在高版本下会出现一个神奇的错误: 如果站点使用的是阿里提供的验证控件的话,就是那种拖动条的,如果是使用CEFSharp的新版本的(目前我是测试过70的) ,会出现拖 ...

  3. 关于H5页面在iPhoneX适配

    ​1.  iPhoneX的介绍 屏幕尺寸 我们熟知的iPhone系列开发尺寸概要如下: △ iPhone各机型的开发尺寸 转化成我们熟知的像素尺寸: △ 每个机型的多维度尺寸 倍图其实就是像素尺寸和开 ...

  4. win7电脑蓝牙 耳机

    == services.msc 然后点击确定. 在服务中我们找到关于蓝牙的设置,双击进入. 将启动类型改成自动或手动,确定后就能使用蓝牙啦. == win7电脑蓝牙耳机 记得之前链接耳机的时候 需要下 ...

  5. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia

    1. GUI 按题意判断即可. #include<stdio.h> #include<iostream> #include<string.h> #include&l ...

  6. node.js官方文档解析 02—buffer 缓冲器

    Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的.且在 V8 堆外分配物理内存.Buffer 的大小在被创建时确定,且无法调整. Buffer 类在 Node.js 中是一个全局 ...

  7. python学习:格式化输出

    格式化输出 代码如下: name = input("Name:") age = input("Age:") job = input("Job:&quo ...

  8. __x__(47)0910第六天__IE6到IE11对于包含中文路径的png显示问题

    问题:IE6额外地除了中文路径外,对于png24的支持度不高,以致于无法透明. 解决方法1,png8 替换: png8 比 png24 小,质量较低,但是在这里可以替代,以解决问题. 使用 ps 打开 ...

  9. vue_mint-ui

    npm install mint-ui -S main.js import { Button } from 'mint-ui'; import "mint-ui/lib/style.css& ...

  10. python语法_字符编码

    二进制: ascll:只能存英文和拉听字符,一个字符占一个字节,8位 gb2312:只能存6700多个中文,1980年 gbk1.0:能存2万多字符,1995年 gbk18030:2000 27000 ...