一道非常棒的搜索题,做完之后感觉神清气爽……

可以肯定的是,本题属于走地图一类的搜索题,适合用bfs求解,然而本题细节极多,有很多需要注意的地方。

我们定义状态三元组(x,y,z)表示当前移动到位置(x,y),且朝向z(我们不妨假定z=0意味着长方体立在地面上,z=1 意味着长方体横躺,x,y表示左边长方体的位置;z=2意味着长方体竖躺,x,y表示上边长方体的位置)。同时,我们读入之后处理起点和终点,并加入队列。我们还要处理关于移动的常量数组(本题的关键),这样我们就可以进行bfs了,但是本题虽然思路简单,但是细节繁多,实现起来有一定难度。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 struct node {
 7     int x,y,z;
 8 }s,t;
 9 queue<node> q;
10 int n,m,dis[510][510][4];
11 char map[510][510];
12 const int fx[4]={0,0,-1,1};
13 const int fy[4]={-1,1,0,0};
14 const int nx[3][4]={{0,0,-2,1},{0,0,-1,1},{0,0,-1,2}};
15 const int ny[3][4]={{-2,1,0,0},{-1,2,0,0},{-1,1,0,0}};
16 const int nz[3][4]={{1,1,2,2},{0,0,1,1},{2,2,0,0}};
17 inline bool can(int x,int y) {
18     return x>=1&&x<=n&&y>=1&&y<=m;
19 }
20 inline bool can(node now) {
21     if(!can(now.x,now.y)) return 0;
22     if(map[now.x][now.y]=='#') return 0;
23     if(now.z==0&&map[now.x][now.y]!='.') return 0;
24     if(now.z==1&&map[now.x][now.y+1]=='#') return 0;
25     if(now.z==2&&map[now.x+1][now.y]=='#') return 0;
26     return 1;
27 }
28 void pre() {
29     for(int i=1;i<=n;i++)
30         for(int j=1;j<=m;j++) {
31             if(map[i][j]=='O') {
32                 map[i][j]='.';
33                 t.x=i; t.y=j; t.z=0;
34             }
35             else if(map[i][j]=='X') {
36                 for(int k=0;k<4;k++) {
37                     int xx=i+fx[k];
38                     int yy=j+fy[k];
39                     if(can(xx,yy)&&map[xx][yy]=='X') {
40                         s.x=min(i,xx); s.y=min(j,yy);
41                         s.z=k<2?1:2;
42                         map[xx][yy]=map[i][j]='.';
43                         break ;
44                     }
45                 }
46                 if(map[i][j]=='X') s.x=i,s.y=j,s.z=0;
47             }
48         }
49 }
50 void bfs() {
51     dis[s.x][s.y][s.z]=0;
52     q.push(s);
53     while(!q.empty()) {
54         node now=q.front();
55         q.pop();
56         for(int i=0;i<4;i++) {
57             node neww;
58             neww.x=now.x+nx[now.z][i];
59             neww.y=now.y+ny[now.z][i];
60             neww.z=nz[now.z][i];
61             if(!can(neww)) continue ;
62             if(dis[neww.x][neww.y][neww.z]==-1) {
63                 dis[neww.x][neww.y][neww.z]=dis[now.x][now.y][now.z]+1;
64                 q.push(neww);
65                 if(neww.x==t.x&&neww.y==t.y&&neww.z==t.z) {
66                     printf("%d\n",dis[neww.x][neww.y][neww.z]);
67                     return ;
68                 }
69             }
70         }
71     }
72     puts("Impossible");
73 }
74 int main() {
75     while(cin>>n>>m&&n+m) {
76         for(int i=1;i<=n;i++)    scanf("%s",map[i]+1);
77         pre();
78         memset(dis,-1,sizeof(dis));
79         while(!q.empty()) q.pop();
80         bfs();
81     }
82     return 0;
83 } 

AC Code

转载于:https://www.cnblogs.com/shl-blog/p/10704256.html

【POJ3322】Bloxorz I相关推荐

  1. 【POJ 3322】 Bloxorz I

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

  2. 【CentOS】利用Kubeadm部署Kubernetes (K8s)

    [CentOS]利用Kubeadm部署Kubernetes (K8s)[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体实验流程 1 系统准 ...

  3. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  4. 【C#】类——里式转换

    类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...

  5. 【C#】Out与ref是干什么的?

    关于return: 1.最后没有写 return 语句的话,表示程序正常退出 2.不需要返回值时,存在return的作用 例子 void main() {return; //return退出该程序的作 ...

  6. 【软件工程】RUP与软件开发5大模型

    软件开发的5大模型 1.瀑布模型:按照人的思维一步一步的开发下去,如果需求分析得当,每个阶段顺利,结果还不错! 2.快速原型模型:后来人们发现,自己不可能一下子就把所有的需求搞清楚,总是在开发的过程中 ...

  7. 【VB】学生信息管理系统5——数据库代码

    这次学生信息管理系统在代码的理解过程中遇到了一些问题.总结如下: 1. sql server的安装过程各个步骤的意思.在安装SQL Server的时候按照网上的步骤,我觉得这个需要学完整个数据库再返回 ...

  8. 白化(预处理步骤)【转】

    白化(预处理步骤)[转] 介绍 我们已经了解了如何使用PCA降低数据维度.在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化.举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很 ...

  9. 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积

    介绍 关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论: 1.Long J, Shelhamer E, Darrell T, et al. Fully convolutional networ ...

最新文章

  1. 用Spotlight on windows 实时监控Windows服务器性能
  2. python编程培训多少钱-python编程培训多少钱?[python培训]
  3. 最大团问题-分支界限法
  4. 如何防止同一账号多次登录
  5. notepad++中的unexpected indent
  6. python中的requests模块的使用大全
  7. 第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数
  8. [案例分析] 打造值得信任的个人品牌究竟靠什么?
  9. 数据库事物用法 SET XACT_ABORT ON
  10. XML与java的应用
  11. python class类的self_Python类class参数self原理解析
  12. keyshot卡住了还能保存吗_Sketchup建模和渲染能取代3dsMax吗?
  13. android:gravity与android:layout_gravity的区别,以及代码设置对应属性
  14. 电信光猫HG2201T超级管理员模式
  15. GBK编码表与编码字库
  16. 虚拟机中无法使用鼠标滚轮(罗技鼠标)
  17. 【RDMA】RDMA编程实例(IBV Verbs )
  18. Nerv-京东高性能前端框架
  19. 【C语言蓝桥杯每日一题】——跑步锻炼
  20. Swift学习笔记 (四十二) 不透明类型

热门文章

  1. 纳多德视点 | 一文读懂PON无源光网络
  2. android4.4 车载灭屏 按任意键及触摸屏幕恢复亮屏
  3. pyCharm 社区版搭建Django项目环境
  4. android h xh xxh 分辨率,关于Android屏幕的一些理解
  5. PHP-Beast 加密你的PHP源代码
  6. 【译】浅谈SOLID原则
  7. Rust入坑指南:常规套路
  8. java程序员的大数据之路(1):Hadoop安装
  9. 2022-4-8 Leetcode 197.上升的温度
  10. android简单的有道词典开发