POJ3322 Bloxorz I 无脑广搜(我死了。。。)
多测不清空,爆零两行泪。。。。我死了QWQ
每个节点3个状态:横坐标,纵坐标,和方向
说一下方向:0:立着,1:竖着躺着,上半部分在(x,y),2:横着躺着,左半部分在(x,y)
然后就有了常量数组:
const int dx[][]={{-,,,},{-,,,},{-,,,}};
const int dy[][]={{,-,,},{,-,,},{,-,,}};
const int dz[][]={{,,,},{,,,},{,,,}};
第一维是状态中的方向,第二维是要扩展的方向(0,1,2,3)
然后就搜他。。。。记得queue要清零,d要清零,sz要清零。。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define R register int
const int dx[][]={{-,,,},{-,,,},{-,,,}};
const int dy[][]={{,-,,},{,-,,},{,-,,}};
const int dz[][]={{,,,},{,,,},{,,,}};
using namespace std;
inline int g() {
R ret=; register char ch; while(!isdigit(ch=getchar()));
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
struct node{
int x,y,z; node() {}
node(int xx,int yy,int zz):x(xx),y(yy),z(zz) {}
};
queue<node>q;
char e[][];
int n,m,sx,sy,sz,ex,ey;
int d[][][];
inline bool ckpos(int x,int y) {return x>&&x<=n&&y>&&y<=m;}
inline bool ck(int x,int y,int z) {
if(!ckpos(x,y)||e[x][y]=='#'||d[x][y][z]!=-) return false;
if(z==&&e[x][y]=='E') return false;
if(z==&&(!ckpos(x+,y)||e[x+][y]=='#')) return false;
if(z==&&(!ckpos(x,y+)||e[x][y+]=='#')) return false; return true;
}
int bfs() {
memset(d,-,sizeof(d)); while(q.size()) q.pop();
q.push(node(sx,sy,sz)); d[sx][sy][sz]=;
while(q.size()) { node u=q.front(); q.pop();
for(R i=;i<;++i) {
node v=node(u.x+dx[u.z][i],u.y+dy[u.z][i],dz[u.z][i]); //cout<<u.x<<" "<<u.y<<" "<<u.z<<" "<<v.x<<" "<<v.y<<" "<<v.z<<endl;
if(!ck(v.x,v.y,v.z)) continue;
q.push(v),d[v.x][v.y][v.z]=d[u.x][u.y][u.z]+;
if(v.x==ex&&v.y==ey&&v.z==) return d[v.x][v.y][v.z];
}
} return -;
}
signed main() {
while(n=g(),m=g(),n!=) { sz=;
for(R i=;i<=n;++i) scanf("%s",e[i]+);
for(R i=;i<=n;++i) for(R j=;j<=m;++j)
if(e[i][j]=='X') { sx=i,sy=j; e[i][j]='.';
if(j<m&&e[i][j+]=='X') sz=,e[i][j+]='.';
if(i<n&&e[i+][j]=='X') sz=,e[i+][j]='.';
} else if(e[i][j]=='O') ex=i,ey=j,e[i][j]='.';
R ans=bfs(); ans==-?printf("Impossible\n"):printf("%d\n",ans);
//for(R i=1;i<=n;++i,cout<<'\n') for(R j=1;j<=m;++j) cout<<d[i][j][0]<<" "<<d[i][j][1]<<" "<<d[i][j][2]<<" ";
}
}
2019.04.26
POJ3322 Bloxorz I 无脑广搜(我死了。。。)的更多相关文章
- 无脑博士的试管们--dfs搜素
无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直到被灌试 ...
- TOJ 2778 数据结构练习题――分油问题(广搜和哈希)
描述 设有大小不等的三个无刻度的油桶,分别能盛满x,y,z公升油.初始时,第一个油桶盛满油,第二.三个油桶为空,在某一个油桶上分出targ公升油. 输入 输入包含多组测试数据.每组数据包含一行.分别x ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- CodeForces 909E Coprocessor(无脑拓扑排序)
You are given a program you want to execute as a set of tasks organized in a dependency graph. The d ...
- POJ-3635 Full Tank? (记忆化广搜)
Description After going through the receipts from your car trip through Europe this summer, you real ...
- P3818 小A和uim之大逃离 II(bfs,有条件的广搜)
题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然一阵南风吹来,一片乌云从南部天边急涌过来 ...
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...
- Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分
题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...
- 【原】无脑操作:express + MySQL 实现CRUD
基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...
随机推荐
- jquery 获取url 参数方法 以及 解决url中文问题
//jQuery 动态给a 标签赋值 跳转 新的页面打开. /* <a class="btn btn-success" id="test" target= ...
- PostgreSQL的索引选型
PostgreSQL里面给全文检索或者模糊查询加索引提速的时候,一般会有两个选项,一个是GIST类型,一个是GIN类型,官网给出的参考如下: There are substantial perform ...
- c语言交换两个变量的值
有两个变量a 和b,想要交换它们的值 int a,b; 能不能这样操作呢? b=a; a=b; 不能啊,这样操作的意思是把a的值放到b中,然后b中的值已经被覆盖掉了,已经不是b原来的那个值了,所以是没 ...
- Linux oprofile命令
一.简介 oProfile是Linux平台上的一个功能强大的性能分析工具,支持两种采样(sampling)方式:基于事件的采样(eventbased)和基于时间的采样(timebased),它可以工作 ...
- java方法学习记录
---恢复内容开始--- 方法重载:两个方法有相同的名字,但参数不同,就是方法重载,且不能仅仅依据修饰符或者返回类型的不同来重载方法. 命令行参数的使用 有时候你希望运行一个程序时候再传递给它消息.这 ...
- C#冒泡排序和直接插入排序
/// <summary> /// 冒泡排序 /// </summary> public static void Mainsdfdrt ...
- up6-chrome 45+安装教程
up6-Chrome 45+安装说明 说明:只需要安装up6.exe即可,up6.exe为插件集成安装包. 1.以管理员身份运行up6.exe.up6.exe中已经集成Chrome 45插件.
- Load-time relocation of shared libraries
E原文地址:http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries/ This article ...
- 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护
建议40:使用event关键字为委托施加保护 在建议中我们实现了一个具有通知功能的文件传输类,如下: class FileUploader { public delegate void FileUpl ...
- MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化
第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...