hdu 1253 胜利大逃亡(广搜,队列,三维,简单)

题目

原来光搜是用队列的,深搜才用栈,我好白痴啊,居然搞错了

三维的基础的广搜题

 

 

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 60
int map[MAXN][MAXN][MAXN],t,a,b,c;
bool vis[MAXN][MAXN][MAXN];
struct tt
{
    int x,y,z,step;
};
queue<tt>q;
int xx[6]={0,0,1,-1,0,0};
int yy[6]={1,-1,0,0,0,0};
int zz[6]={0,0,0,0,1,-1};
int bfs()
{
    if(a==1&&b==1&&c==1)return 0;
    while(!q.empty())
        q.pop();
    memset(vis,false,sizeof(vis));
    tt front,rear,temp;
    front.x=0;front.y=0;front.z=0;front.step=0;
    q.push(front);
    vis[0][0][0]=true;
    while(!q.empty())
    {
        temp=q.front();
        q.pop();
        if(temp.x+1==a&&temp.y+1==b&&temp.z+1==c)
            return temp.step;//原来是这个放错地方了,应该对出栈的数据进行检验
        for(int i=0;i<6;i++)
        {
            rear.x=temp.x+xx[i];
            rear.y=temp.y+yy[i];
            rear.z=temp.z+zz[i];
            rear.step=temp.step+1;
            if(rear.x>=0&&rear.x<a&&rear.y>=0&&rear.y<b&&rear.z>=0&&rear.z<c&&map[rear.x][rear.y][rear.z]==0&&vis[rear.x][rear.y][rear.z]==false)
            {
                q.push(rear);
                vis[rear.x][rear.y][rear.z]=true;
            }
        }
    }
    return t+1;
}

int main()
{
    int n,i,j,k,ans;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d%d",&a,&b,&c,&t);
        for(i=0;i<a;i++)
        {
            for(j=0;j<b;j++)
            {
                for(k=0;k<c;k++)
                {
                    scanf("%d",&map[i][j][k]);  
                }
            }
        }
        ans=bfs();
        if(ans>t)
            printf("-1\n");
        else
            printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2014-02-12 16:37  laiba2004  Views(145)  Comments(0Edit  收藏  举报