多测不清空,爆零两行泪。。。。我死了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. SpringMVC 课程第一天

    SpringMVC第一天   框架课程 1. 课程计划 第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a) 框架结构 b) 组件说明 4.SpringMVC整合My ...

  2. 面试题:String StringBufere StringBuilder 不用看

    一.String 使用 private final char value[]来实现字符串存储 所以String对象创建之后就不能再修改此对象中存储的字符串内容,所以说String本质是字符数组char ...

  3. win32多线程 (一) 线程创建与结束等待

    #include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std ...

  4. PHP加密与解密

    password_hash ( string $password , integer $algo [, array $options ] ) 加密,生成60位得字符串 $algo:一个用来在散列密码时 ...

  5. Browsersync 简介 and 使用

    简介 省时的浏览器同步测试工具,Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面. 曾经我们每改一次的代码,都需要手动去刷新一次 ...

  6. 第三周Linux编程实例练习

    通过以下程序来练习 head.h # ifndef HEAD_H #define HEAD_H #include <stdio.h> int add(int,int); int sub(i ...

  7. LightOJ 1258 Making Huge Palindromes (Manacher)

    题意:给定上一个串,让你在后面添加一些字符,使得这个串成为一个回文串. 析:先用manacher算法进行处理如果发现有字符匹配超过最长的了,结束匹配,答案就是该字符前面那个长度加上该串原来的长度. 代 ...

  8. 享元(Flyweight)模式

    享元(Flyweight)模式:运用共享技术有效的支持大量细粒度的对象. /* * 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口. 那些需要外蕴 ...

  9. .net 空接合操作符 ??

    C# 提供了一个所谓的 ”空接合操作符“ - 即??操作符,他要获取两个操作数. 假如左边的操作数部位null,就返回这个操作数.如果左边的操作数为null就返回右边. 空接合操作符一个妙处在于,它既 ...

  10. Azure SQL作業

    由於要定期去刪除比較久的資料,礙於Azure SQL DB目前無法直接創建作業,目前找到一種方式就是通過local的SQL SERVER來執行AZURE SQL指令. 步驟如下: SQL Server ...