Description

小k是时空贸易者,他经常在两个平行宇宙之间往来经商,现在他要从S点到达E点,问最少需要多长时间。(已知小k在同一个宇宙中只能向上下左右四个方向移动,每次移动需要1个单位时间,且不能在危险小行星带'#'中移动,遇到黑洞'O'时,他会被瞬间吸入另一个宇宙的对应的同一位置,比如从一个宇宙的黑洞处(2,2)必须且只能移动到另一个宇宙的(2,2)位置)

Input

多组输入数据,每组数据第一行包含两个整数n,m(2<=n,m<=1000),表示两个宇宙的大小。
接下来n行表示第一个宇宙,再接下来n行表示第二个宇宙。

Output

每组数据输出一个整数,表示最短时间,如果不能到达目的地,输出-1

Sample Input

4 6
#S##E#
#.##..
#.O.#.
#####. ######
#.####
#..O##
##...O

Sample Output

11

// 其实这题不难,但是要注意细节问题
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std; char data[][][];
int visit[][][];
int ki,kj,kk,ei,ej,ek;
int n,m;
int to[][]={{,},{,-},{,},{-,}}; struct node
{
int i;
int j;
int k;
int time;
}; int go(int i,int j,int k)
{
if(j>=&&j<n&&k>=&&k<m&&data[i][j][k]!='#')
return ;
return ;
} void bfs()
{
node st,ed;
queue <node> q;
st.i=ki;
st.j=kj;
st.k=kk;
st.time=;
memset(visit,,sizeof(visit));
visit[ki][kj][kk]=;
q.push(st);
while(!q.empty())
{
st=q.front();
q.pop();
if(st.i==ei&&st.j==ej&&st.k==ek)
{
cout<<st.time<<endl;
return ;
}
if(data[st.i][st.j][st.k]=='O')
{
int t=;
if(st.i==)
t=;
if(data[t][st.j][st.k]!='O'&&data[t][st.j][st.k]!='#'&&visit[t][st.j][st.k]==)
{
//O的对面是O或#时不能走
st.i=t;
visit[t][st.j][st.k]=;
}
else continue;//看队列中的下一个
}
for(int i=;i<;i++)
{
ed.i=st.i;
ed.j=st.j+to[i][];
ed.k=st.k+to[i][];
if(go(ed.i,ed.j,ed.k)&&visit[ed.i][ed.j][ed.k]==)
{
visit[ed.i][ed.j][ed.k]=;
ed.time=st.time+;
q.push(ed);
}
}
}
cout<<"-1"<<endl;
return ;
} int main()
{
while(cin>>n>>m)
{
for(int i=;i<;i++)
{
for(int j=;j<n;j++)
{
scanf("%s",data[i][j]);//减少时间
for(int k=;k<m;k++)
{
if(data[i][j][k]=='S')
{
ki=i;kj=j;kk=k;
}
if(data[i][j][k]=='E')
{
ei=i;ej=j;ek=k;
}
}
}
}
bfs();
}
return ;
}

nefu 1191 平行宇宙 (bfs)的更多相关文章

  1. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...

  2. HDU--4784 Dinner Coming Soon DP+BFS

    题意非常长非常变态.一个人要到他男朋友家,他最初有R元以及T分钟的时间来赶到他男朋友家.有N个房子M条道路,每条道路有须要消耗的时间以及过路费,同一时候还要顺路做食盐生意,起初身上没有食盐,最多带B袋 ...

  3. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  4. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  5. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  6. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  7. Sicily 1215: 脱离地牢(BFS)

    这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...

  8. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

  9. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

随机推荐

  1. Zookeeper单机版安装(CentOS 7环境下)

    一.环境操作系统和软件版本介绍 1.环境操作系统为CentOS Linux release 7.2.1511 (Core) 可用cat /etc/redhat-release查询 2.软件版本 Zoo ...

  2. Hadoop优先级调度

    当同时在集群中运行多个作业时,默认情况下,Hadoop将提交的作业放入一个FIFO,一个作业结束后,Hadoop就启动下一个作业. 当一个运行时间长但是优先级较低的作业先于运行时间短而优先级较高的作业 ...

  3. 【1】JavaScript编程全解笔记(一)

    1.概述 本书涵盖了 JavaScript 各个方面的主题,从客户端以及服务端 JavaScript 等基础内容,主要讲了  HTML5.Web API.Node.js 与 WebSocket 等技术 ...

  4. myeclipse里如何添加mysql数据库

    首先声明,这只是我本人的一些经验,不代表任何集体和个人的利益,请勿没事就当喷子来喷我.我希望对一些对这方面学习的朋友有帮助,当然,我自己也是菜鸟级别啦!!!!!!!!!!!! 首先是电脑必要安装了my ...

  5. DEBUG 调试

    1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method,然后return跳出此met ...

  6. supervisor启动流程

    Supervisor结构: 单点结构如图: 1. 初始化时,启动进程Supervisor,根据 Nimbus分配的任务情况触发启动/停用Worker Jvm进程! 2. 每个Worker进程启动一个 ...

  7. ios开发判断手机是否安装微信app

    1.代码如下 if ([WXApi isWXAppInstalled]) 2.如果以上代码无效,请在plist文件中添加如下内容

  8. 小例子解释wait与notify的区别

    系统慢可能有很多种原因,硬件资源不足,语句不优化,结构设计不合理,缺少必要的运维方式.所有的这些问题都可以在阻塞与等待中看出端倪,发现并解决问题. 首先是下载开发工具,磨刀不误砍材工.点此下载 这是一 ...

  9. js string 转 int 注意的问题——parseInt

    < script > var str = '1250';alert(Number(str)); //得到1250 alert(parseInt(str)); //得到1250 var st ...

  10. svn添加新文件自动忽略

    背景:做项目,用的客户端TortoiseSVN1.8,发现新建的文件,不是问号(?),而是自动忽略的减号,提交的时候也确实没有,说明不是符号混乱,确实是被忽略了,网上找了解决方案记录如下: 查看svn ...