【POJ3322】Bloxorz I
一道非常棒的搜索题,做完之后感觉神清气爽……
可以肯定的是,本题属于走地图一类的搜索题,适合用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相关推荐
- 【POJ 3322】 Bloxorz I
[题目链接] http://poj.org/problem?id=3322 [算法] 广度优先搜索 [代码] #include <algorithm> #include <bitse ...
- 【CentOS】利用Kubeadm部署Kubernetes (K8s)
[CentOS]利用Kubeadm部署Kubernetes (K8s)[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体实验流程 1 系统准 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- 【C#】类——里式转换
类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...
- 【C#】Out与ref是干什么的?
关于return: 1.最后没有写 return 语句的话,表示程序正常退出 2.不需要返回值时,存在return的作用 例子 void main() {return; //return退出该程序的作 ...
- 【软件工程】RUP与软件开发5大模型
软件开发的5大模型 1.瀑布模型:按照人的思维一步一步的开发下去,如果需求分析得当,每个阶段顺利,结果还不错! 2.快速原型模型:后来人们发现,自己不可能一下子就把所有的需求搞清楚,总是在开发的过程中 ...
- 【VB】学生信息管理系统5——数据库代码
这次学生信息管理系统在代码的理解过程中遇到了一些问题.总结如下: 1. sql server的安装过程各个步骤的意思.在安装SQL Server的时候按照网上的步骤,我觉得这个需要学完整个数据库再返回 ...
- 白化(预处理步骤)【转】
白化(预处理步骤)[转] 介绍 我们已经了解了如何使用PCA降低数据维度.在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化.举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很 ...
- 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积
介绍 关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论: 1.Long J, Shelhamer E, Darrell T, et al. Fully convolutional networ ...
最新文章
- 用Spotlight on windows 实时监控Windows服务器性能
- python编程培训多少钱-python编程培训多少钱?[python培训]
- 最大团问题-分支界限法
- 如何防止同一账号多次登录
- notepad++中的unexpected indent
- python中的requests模块的使用大全
- 第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数
- [案例分析] 打造值得信任的个人品牌究竟靠什么?
- 数据库事物用法 SET XACT_ABORT ON
- XML与java的应用
- python class类的self_Python类class参数self原理解析
- keyshot卡住了还能保存吗_Sketchup建模和渲染能取代3dsMax吗?
- android:gravity与android:layout_gravity的区别,以及代码设置对应属性
- 电信光猫HG2201T超级管理员模式
- GBK编码表与编码字库
- 虚拟机中无法使用鼠标滚轮(罗技鼠标)
- 【RDMA】RDMA编程实例(IBV Verbs )
- Nerv-京东高性能前端框架
- 【C语言蓝桥杯每日一题】——跑步锻炼
- Swift学习笔记 (四十二) 不透明类型