多测不清空,爆零两行泪。。。。我死了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 无脑广搜(我死了。。。)的更多相关文章

  1. 无脑博士的试管们--dfs搜素

    无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直到被灌试 ...

  2. TOJ 2778 数据结构练习题――分油问题(广搜和哈希)

    描述 设有大小不等的三个无刻度的油桶,分别能盛满x,y,z公升油.初始时,第一个油桶盛满油,第二.三个油桶为空,在某一个油桶上分出targ公升油. 输入 输入包含多组测试数据.每组数据包含一行.分别x ...

  3. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

  4. CodeForces 909E Coprocessor(无脑拓扑排序)

    You are given a program you want to execute as a set of tasks organized in a dependency graph. The d ...

  5. POJ-3635 Full Tank? (记忆化广搜)

    Description After going through the receipts from your car trip through Europe this summer, you real ...

  6. P3818 小A和uim之大逃离 II(bfs,有条件的广搜)

    题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然一阵南风吹来,一片乌云从南部天边急涌过来 ...

  7. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  8. Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分

    题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...

  9. 【原】无脑操作:express + MySQL 实现CRUD

    基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...

随机推荐

  1. MySQL5.7插入中文乱码

    参考: https://blog.csdn.net/kelay06/article/details/60870138 https://blog.csdn.net/itmr_liu/article/de ...

  2. Django框架 之 查询 Extra

    Django框架 之 查询 Extra extra 1 2 extra(select=None, where=None, params=None,       tables=None, order_b ...

  3. Servlet请求转发 RequestDispatcher接口.RP

    在Servlet中,利用RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,甚至是HTML页面,来处理对请求的响应. 一,RequestDispatcher接口 ...

  4. 黑盒测试实践-任务进度-Day02

    使用工具 selenium 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 在经过了昨天的基本任务分配之后,今天大家就开始了各自的内容,以下是大家任务的进度情况汇总. 华同学(任务 ...

  5. SVN下载地址及注意事项

    SVN下载地址:VisualSVN:http://www.visualsvn.com/server/download     服务器端(添加仓库和用户)TortoiseSVN:http://torto ...

  6. 如何处理与开发有争议的Bug?

     工作中,测试人员有时会遇到类似的问题:提交了一份软件缺陷报告,可由于某种原因,无论是开发人员还是开发经理就是不愿修改程序.应如何处理这类问题呢?我认为,当对报告出现分歧意见后,测试工程师应首先做如下 ...

  7. 编写高质量代码改善C#程序的157个建议——建议3: 区别对待强制转型与as和is

    建议3: 区别对待强制转型与as和is 在阐述本建议之前,首先需要明确什么是强制转型,以及强制转型意味着什么.从语法结构上来看,类似下面的代码就是强制转型. secondType = (SecondT ...

  8. indexOf(String.indexOf 方法)

    字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个字符依此类推)如果说没有找到则返回 -1 返回 St ...

  9. Async异步委托

    /// <summary> /// 异步委托 /// </summary> public delegate void AsyncHandler(); public static ...

  10. 定制JMeter取样器

    JMeter运行你区定义自己的取样器sampler,方法很简单,只需继承类org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClie ...