码迷,mamicode.com
首页 > 其他好文 > 详细

zoj1940

时间:2015-08-10 14:50:01      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

链接:点击打开链接

题意:三维搜索‘S’为起点,‘E’为终点,求走出的最短时间

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
int xx[]={1,-1,0,0,0,0};                            //方向向量
int yy[]={0,0,1,-1,0,0};
int zz[]={0,0,0,0,1,-1};
int p,q,r;
char str[35][35][35];
struct node{
    int x,y,z,sum;
};
int bfs(node st,node en){
    int i;
    queue<node>qu;
    node cur,temp;
    qu.push(st);
    while(qu.size()){
        cur=qu.front();qu.pop();
        if(cur.x==en.x&&cur.y==en.y&&cur.z==en.z)
        return cur.sum;                          //找到之后直接返回走的步数
        for(i=0;i<6;i++){
            temp.x=cur.x+xx[i];
            temp.y=cur.y+yy[i];
            temp.z=cur.z+zz[i];
            temp.sum=cur.sum+1;
            if(temp.x>=0&&temp.x<p&&temp.y>=0&&temp.y<q&&temp.z>=0&&temp.z<r)
            if(str[temp.x][temp.y][temp.z]!='#'){
            qu.push(temp);
            str[temp.x][temp.y][temp.z]='#';       //走过之后就变成'#',省掉一个数组记录
            }                                      //是否走过
        }
    }
    return -1;
}
int main(){
    int i,j,k,sumsum;
    node st,en;
    while(scanf("%d%d%d",&p,&q,&r)!=EOF&&(p||q||r)){
        for(i=0;i<p;i++)
        for(j=0;j<q;j++)
        for(k=0;k<r;k++){
            cin>>str[i][j][k];
            if(str[i][j][k]=='S')
            st.x=i,st.y=j,st.z=k,st.sum=0;
            else if(str[i][j][k]=='E')
            en.x=i,en.y=j,en.z=k;
        }
        sumsum=bfs(st,en);
        if(sumsum==-1)
        printf("Trapped!\n");
        else
        printf("Escaped in %d minute(s).\n",sumsum);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

zoj1940

标签:

原文地址:http://blog.csdn.net/stay_accept/article/details/47398099

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!