Uva532(三维搜索)

题目链接https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=473

= =这题就是就是给你一个三维的图,然后给你一个起点,一个终点,中间有障碍= =问你是否能够从起点走到终点,如果能最少的步数是多少

最优解= =用bfs,因为是三维,所以用三个方向数组来来确定下一步走哪里

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
#define N 33
using namespace std;
int f[N][N][N];
int x[6]={1,-1,0,0,0,0},y[6]={0,0,1,-1,0,0},z[6]={0,0,0,0,-1,1};
struct node
{
    int x,y,z,step;
};
int sx,sy,sz,ex,ey,ez;
int n,m,k;
int flag;
int bfs()
{
    queue<node>q;
    node in,out;
    in.x=sx,in.y=sy,in.z=sz;
    f[sx][sy][sz]=1;
    in.step=0;
    q.push(in);
    while(!q.empty())
    {
        in=q.front();
        q.pop();
        if(in.x==ex&&in.y==ey&&in.z==ez)
        {
        flag=1;
        return in.step;
        }
        for(int i=0;i<6;i++)
        {
            out.x=in.x+x[i];
            out.y=in.y+y[i];
            out.z=in.z+z[i];
            out.step=in.step;
            if(out.x>=0&&out.x<n&&out.y>=0&&out.y<m&&out.z>=0&&out.z<k&&!f[out.x][out.y][out.z])
            {
            f[out.x][out.y][out.z]=1;
            out.step++;
            q.push(out);
            }
        }
    }
}
int main()
{
    while(scanf("%d%d%d",&k,&n,&m)!=EOF&&n&&m&&k)
    {
        flag=0;
        char s[100];
        memset(f,0,sizeof(f));
        for(int i=0;i<k;i++)
        {
            for(int j=0;j<n;j++)
            {
                scanf("%s",s);
                for(int l=0;l<m;l++)
                {
                    if(s[l]==‘S‘)
                    {
                    sx=j;
                    sy=l;
                    sz=i;
                    }
                    else if(s[l]==‘E‘)
                    {
                    ex=j;
                    ey=l;
                    ez=i;
                    }
                    else if(s[l]==‘#‘)
                    f[j][l][i]=1;
                }
            }
        }
        int ans=bfs();
        if(flag)
        printf("Escaped in %d minute(s).\n",ans);
        else
        printf("Trapped!\n");
    }
    return 0;
}
时间: 2024-09-28 15:43:13

Uva532(三维搜索)的相关文章

hdu1240 三维搜索 bfs dfs都可以

题意,给出一个N,这是这个三空间的大小,然后给出所有面的状况O为空地,X为墙,再给出起始点的三维坐标和终点的坐标,输出到达的步数三维的BFS,很裸的题,不过一定要注意这一题给的坐标x表示列,y表示行,z表示层,实际输入的时候调试一下看看给的坐标是不是跟样例在图中所指的对象一样就行了.http://blog.csdn.net/iaccepted/article/details/23277717bfs讲得好http://iprai.hust.edu.cn/icl2002/algorithm/algo

SDUT 1124-飞跃原野--三维BFS

飞跃原野 Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 勇敢的法里奥出色的完成了任务之后,正在迅速地向自己的基地撤退.但由于后面有着一大群追兵,所以法里奥要尽快地返回基地,否则就会被敌人逮住. 终于,法里奥来到了最后的一站:泰拉希尔原野,穿过这里就可以回到基地了.然而,敌人依然紧追不舍.不过,泰拉希尔的地理条件对法里奥十分有利,众多的湖泊随处分布.敌人需要绕道而行,但法里奥还是决定找一条能尽快回到基地的路. 假设泰拉希尔原野

HDU - 1253 胜利大逃亡 (搜索)

Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃

BFS POJ 2251 Dungeon Master

题目传送门 1 /* 2 BFS:这题很有意思,像是地下城,图是立体的,可以从上张图到下一张图的对应位置,那么也就是三维搜索,多了z坐标轴 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <queue> 8 using namespace std; 9 10 const int MAXN = 33; 11 const int INF = 0x3f3

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[]=

hdu 1240:Asteroids!(三维BFS搜索)

Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3159    Accepted Submission(s): 2106 Problem Description You're in space.You want to get home.There are asteroids.You don't want to hit

UVA532 Dungeon Master

问题链接:UVA532 Dungeon Master. 题意简述:三维空间地牢(迷宫),每个点由'.'(可以经过).'#'(墙).'S'(起点)和'E'(终点)组成.移动方向有上.下.左.右.前和后6个方向.每移动一次耗费1分钟,求从'S'到'E'最快走出时间.不同L层,相同RC处是连通的. 问题分析:一个三维迷宫,典型的BFS问题.在BFS搜索过程中,走过的点就不必再走了,因为这次再走下去不可能比上次的步数少. 程序中,使用了一个队列来存放中间节点,但是每次用完需要清空.需要注意的一点,为了编

POJ3528 HDU3662 三维凸包模板

POJ3528 HDU3662 第一道题 给定若干点 求凸包的表面积,第二题 给定若干点就凸包的面数. 简单说一下三维凸包的求法,首先对于4个点假设不共面,确定了唯一四面体,对于一个新的点,若它不在四面体内,为了让它进入凸包, 则对于所有凸包上的边,若边的一面是该点可以看到的而另一面看不到,则该点与该边构成的面要加入凸包. 模板代码非常清晰, #include<stdio.h> #include<algorithm> #include<string.h> #includ

专题一、简单搜索 - Virtual Judge

很久以前刷完了Virtual Judge上的简单搜索专题,现总结如下: POJ 1321 由于题目的数据范围比较小,可以直接dfs暴力.读入时记录每个空位的位置,保存在pX[]以及pY[]数组中.暴力的时候统计当前处理第几个空格以及当前处理到了第几行即可. #include <iostream> #include <memory.h> using namespace std; const int MAX = 128; long long ans; int N, K, nCnt; b