题意:传送门
对应游戏:传送门
题解:对于这个木块,可以发现有三个状态,第一个状态是直立的,第二个状态是横躺着,第三个状态是竖躺着,那么状态维护三个值x,y,liex,y,liex,y,lie,分别对应位置以及状态,最后在维护dist[x][y][lie]dist[x][y][lie]dist[x][y][lie]表示到达这个位置且是lielielie这种状态的最小步数,维护好各种边界条件即可。
code:code:code:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=510;
struct State{int x,y,lie;State(int _x=-1,int _y=-1,int _lie=-1):x(_x),y(_y),lie(_lie){}
};
int n,m,dist[N][N][3];
char g[N][N];
bool check(int x,int y)
{if(x<0||x>=n||y<0||y>=m)return false;return g[x][y]!='#';
}
int bfs(State start,State end)
{int d[3][4][3] = {{{-2, 0, 2}, {0, 1, 1}, {1, 0, 2}, {0, -2, 1}},{{-1, 0, 1}, {0, 2, 0}, {1, 0, 1}, {0, -1, 0}},{{-1, 0, 0}, {0, 1, 2}, {2, 0, 0}, {0, -1, 2}}};memset(dist,-1,sizeof dist);dist[start.x][start.y][start.lie]=0;queue<State>q;q.push(start);while(!q.empty()){State t=q.front();q.pop();for(int i=0;i<4;i++){State next=State(t.x+d[t.lie][i][0],t.y+d[t.lie][i][1],d[t.lie][i][2]);int x=next.x,y=next.y;if(!check(x,y))continue;if(next.lie==0){if(g[x][y]=='E')continue;}else if(next.lie==1){if(!check(x,y+1))continue;}else{if(!check(x+1,y))continue;}if(dist[next.x][next.y][next.lie]==-1){dist[next.x][next.y][next.lie]=dist[t.x][t.y][t.lie]+1;q.push(next);}}}return dist[end.x][end.y][end.lie];
}
int main()
{while(cin>>n>>m,n||m){for(int i=0;i<n;i++)cin>>g[i];State start,end;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(start.x==-1&&g[i][j]=='X'){if (g[i + 1][j] == 'X') start = State(i, j, 2);else if (g[i][j + 1] == 'X') start = State(i, j, 1);else start = State(i, j, 0);}if(g[i][j]=='O'){end=State(i,j,0);}}}int res=bfs(start,end);if(res==-1)puts("Impossible");else printf("%d\n",res);}return 0;
}

Bloxorz I POJ - 3322(广度优先搜索)相关推荐

  1. Bloxorz I POJ - 3322 bfs

    一.内容 立体推箱子是一个风靡世界的小游戏. 游戏地图是一个N行M列的矩阵,每个位置可能是硬地(用"."表示).易碎地面(用"E"表示).禁地(用"# ...

  2. 【POJ 3322】 Bloxorz I

    [题目链接] http://poj.org/problem?id=3322 [算法] 广度优先搜索 [代码] #include <algorithm> #include <bitse ...

  3. 广度优先搜索(BFS)——抓住那头牛(POJ 4001)

    本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...

  4. 搜索技术【广度优先搜索】 - 嵌套广度优先搜索 【POJ No. 1475】 推箱子 Pushing Boxes

    搜索技术[广度优先搜索] - 嵌套广度优先搜索 [POJ No. 1475] 推箱子 Pushing Boxes 在广度优先搜索里面嵌套广度优先搜索的算法被称为嵌套广度优先搜索(或称双重广度优先搜索) ...

  5. POJ 3322 BFS

    题意 传送门 POJ 3322 Bloxorz I 题解 长方体当前的状态为其横.纵坐标与摆放状态组成的三元组,为了方便表示,只取长方体左上方的位置作为横.纵坐标状态,BFSBFSBFS 求解即可. ...

  6. 深度优先搜索(DFS)与广度优先搜索(BFS)详解

    原文来自<挑战程序设计竞赛> 深度优先搜索(DFS)和宽度优先搜索(BFS)都是常见的搜索算法.在学习DFS和BFS之前,我们首先得知道递归函数的概念. 1. 递归函数 通俗地讲,一个函数 ...

  7. [C] 层层递进——C语言实现广度优先搜索

    以防万一有人想不开要做染色的题呢?比如我. 广度优先搜索 如何实现一个广度优先搜索 广搜(bfs)是一个层层递进的概念,与深搜的不撞南墙不回头不同,广搜更像一个感染的过程,一个点只能感染到它周边的点. ...

  8. python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  9. 初识广度优先搜索与解题套路

    作者 | P.yh 来源 | 五分钟学算法 初识广度优先搜索 在讲解广度优先搜索之前,我们来看看几个常见的数据结构,链表.树.图. 先来看看其中比较简单的数据结构 - 链表,它和数组类似,也是一个线性 ...

最新文章

  1. 一个云原生双活架构方案
  2. 支付宝扫一下就能体验的深度学习模型
  3. oracle用户手册在哪里,Oracle用户管理常用操作参考手册
  4. VTK:vtkAnnotatedCubeActor用法实战
  5. 静脉阻塞指标+补充笔记
  6. Chrome无法播放m3u8格式的直播视频流的问题解决
  7. 甲骨文Java 14来啦!
  8. 边看边练之Django(二)---- Django的URL设置
  9. IE8变成IE7的显示方式
  10. python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【二】人脸预处理...
  11. 网站建设中做到需求分析细致,网站优化也就顺理成章了
  12. 谷歌显示不安全连接到服务器,谷歌浏览器提示不安全怎么办
  13. 2016年腾讯校招笔试题
  14. 【语音增强论文解读 03】TCNN: TEMPORAL CONVOLUTIONAL NEURAL NETWORK FOR REAL-TIME SPEECHENHANCEMENT IN THE TIME
  15. flyway命名规范
  16. html图像css设置大小,关于html:CSS显示调整大小和裁剪的图像
  17. c语言指针面试经典选择题及答案,C语言指针经典练习题-及答案
  18. 网络原理 | 网络设备及相关技术(集线器、交换机、主机、路由器)、冲突域与广播域
  19. CSS-精灵图片的使用(从一张图片中截图指定位置图标)
  20. canvas 闭合_canvas绘图无法闭合问题

热门文章

  1. 关于移动端布局不兼容ipad和ipad pro 解决方法
  2. 计算机语言学专业排名,语言学专业排名
  3. 仿小米商城二维码下拉
  4. 【PID】PID的调整方法
  5. 【MMD】个人记录向
  6. 28岁裸辞转行前端是怎样的一种体验
  7. AE基础教程第一阶段——19合成层属性
  8. 寄存器(3)KDB入门+MIPS汇编及汇编代码详解
  9. 2011-2019,巴塞罗那不相信眼泪
  10. 介绍一下义乌个体结汇美金账户的使用