平行宇宙
Problem:1191
Time Limit:2000ms
Memory Limit:65535K
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
Hint
Source
by 张猛治
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
typedef struct {
int x;
int y;
int step;
}Node;
int dir_x[]={-1,0,0,1};
int dir_y[]={0,-1,1,0};
Node st,en;
int ans,n,m;
char maze[2010][1010];
void bfs(){
ans=0;
queue <Node> a;
while(!a.empty()) a.pop();
a.push(st);
Node temp,temp1,now;
while(!a.empty()){
temp=a.front();a.pop();
if(maze[temp.x][temp.y]=='#'||maze[temp.x][temp.y]=='O') continue;
if(maze[temp.x][temp.y]=='E') {ans=temp.step;return ;}
for(int i=0;i<4;i++){
now.x=temp.x+dir_x[i];
now.y=temp.y+dir_y[i];
now.step=temp.step+1;
if(now.x<0||now.y<0||now.x>2*n||now.y>=m||maze[now.x][now.y]=='#'){
continue;
}else if(maze[now.x][now.y]=='O'){
if(now.x>n)
temp1.x=now.x-(n+1);
else
temp1.x=now.x+(n+1);
temp1.y=now.y;temp1.step=now.step;
a.push(temp1);
maze[now.x][now.y]='#';
}else{
a.push(now);
}
}
maze[temp.x][temp.y]='#';
}
ans=-1;
return ;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&maze[i][j]);
if(maze[i][j]=='S'){
st.x=i;
st.y=j;
st.step=0;
}
}
getchar();
}
getchar();
for(int j=0;j<m;j++)
maze[n][j]='#';
for(int i=n+1;i<=2*n;i++){
for(int j=0;j<m;j++){
scanf("%c",&maze[i][j]);
if(maze[i][j]=='S'){
st.x=i;
st.y=j;
st.step=0;
}
}
getchar();
}
bfs();
cout<<ans<<endl;
}
}
学长的:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<queue>
using namespace std;
char map[2][1005][1005];
int dis[2][1005][1005];
int mi[4]={0,0,-1,1},mj[4]={1,-1,0,0};
struct D {
int t,i,j;
D(int tt,int ii,int jj) {
t = tt; i = ii; j = jj;
}
};
int main() {
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF) {
memset(dis,-1,sizeof(dis));
int st=-1,si,sj;
for(int t=0;t<2;t++) {
for(int i=0;i<n;i++) {
scanf("%s",map[t][i]);
if(st!=-1) continue;
for(int j=0;j<m;j++) {
if(map[t][i][j]=='S') {
st = t;
si = i;
sj = j;
}
}
}
}
queue<D> que;
dis[st][si][sj]=0;
que.push(D(st,si,sj));
while(!que.empty()) {
D tmp = que.front();
que.pop();
int t=tmp.t,i=tmp.i,j=tmp.j;
int nt = t;
if(map[t][i][j]=='O') {
nt = !nt;
if(dis[nt][i][j]==-1&&map[nt][i][j]!='O'&&map[nt][i][j]!='#') dis[nt][i][j]=dis[t][i][j];
else continue;
}
for(int k=0;k<4;k++) {
int ti=i+mi[k],tj=j+mj[k];
if(ti<0||ti>=n||tj<0||tj>=m||map[nt][ti][tj]=='#'||dis[nt][ti][tj]!=-1) continue;
if(map[nt][ti][tj]=='E') {
printf("%d\n",dis[nt][i][j]+1);
goto NEXT;
}
dis[nt][ti][tj] = dis[nt][i][j]+1;
//printf("%d %d %d %d\n",nt,ti,tj,dis[nt][ti][tj]);
que.push(D(nt,ti,tj));
}
}
puts("-1");
NEXT:;
}
}