zoj1940

链接:点击打开链接

题意:三维搜索‘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;
}

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

时间: 2024-10-15 12:06:47

zoj1940的相关文章

zoj1940(三维广搜)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=940 分析:三维其实就是六个方向地搜索,思维清晰且细心点,很快就AC了. #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #incl