NEFU 1191 BFS
来源:互联网 发布:楼凤阁 源码 编辑:程序博客网 时间:2024/06/16 22:30
平行宇宙
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:; }}
0 0
- NEFU 1191 BFS
- nefu 674HELP(bfs)
- NEFU 1214 逃出迷宫 (BFS寻径)
- nefu 406
- nefu 115
- nefu 116
- nefu 84
- NEfu 639
- nefu 636
- NEFU 627
- nefu 667
- NEFU 1037
- NEFU 659
- nefu 520
- NEFU 564
- NEFU 560
- NEFU 1002
- NEFU OJ20
- android动画效果的基础设置
- mysql和oracle对于内连接和左右连接的使用(一)
- 选夫婿1
- #GWT#之TextBox注册onPaste事件
- 函数指针应用总结(未完成)
- NEFU 1191 BFS
- 51nod--1183 编辑距离
- (二)OpenGL中的Shader
- [转]Spring事务管理(详解+实例)
- 高斯消元异或版模板
- OkHttp与Retrofit上传文件详解
- 教你如何使用IDEA新建WEB工程
- 中后求前
- LeetCode-Palindrome Numbers