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. Vultr新加坡机房速度怎么样?值得购买吗?最新评测!

    2016年9月,Vultr vps开通了新加坡Singapore机房线路.与知名的竞争对手Digitalocean和Linode一样,新加坡机房对亚洲速度友好,是讨用户欢心的一个进步. 但是,vult ...

  2. JS 获取网页的宽高

    网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.body.offsetWi ...

  3. intellij 出现“Usage of API documented as @since 1.6+”的解决办法

    Usage of API documented as @since 1.6+ This inspection finds all usages of methods that have @since ...

  4. CSU 1812 三角形和矩形

    湖南省第十二届大学生计算机程序设计竞赛$J$题 计算几何. #pragma comment(linker, "/STACK:1024000000,1024000000") #inc ...

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

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

  6. .a与.framework的区别

    库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. iOS中静态库形式: .a和.framework 动态库:链接时不复制,程序运行 ...

  7. oc 导航栏跳转指定界面

    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIn ...

  8. MYSQL 主从复制(NIOT)

    一.主数据库操作设置(A) 1.修改配置文件,vim /etc/my.cnf,然后重启mysqld,/etc/init.d/mysqld restart [mysqld]<要在mysqld中括号 ...

  9. vs2010帮助文档下载以及帮助查看器(H3Viewer)的使用

    在工作中遇到想查看vs2010的帮助文档.推荐使用H3Viewer.一个第三方的免费软件,独立于VS2010运行的帮助查看器.这方面的资料并不多.把本次自己使用的心得分享给大家. H3Viewer官方 ...

  10. 批量修改安卓apk包名

    1.准备工作 1.1 反编译工具apktool下载 1.2 java, android SDK安装 1.2 python安装 2.反编译现有包 apktool.bat d test.apk 3. 直接 ...