hdu1253(胜利大逃亡)

来源:互联网 发布:风险指数矩阵 编辑:程序博客网 时间:2024/05/01 21:22

题目链接:click here~

题目解析:比较简单的广搜,搜6个方向就可以了,不过搜索时要记得标记走过的结点,并且还要判断不能越界!一次就A了,写的代码比较繁琐,因为是初学搜索,没关系,会好起来的。其实一般的广搜模板都差不多。

代码如下:

#include<stdio.h>#include<string.h>#include<queue>using namespace std;struct node{    int x,y,z,time;};int visit[60][60][60];int map[60][60][60];int A,B,C,T;void bfs(int a,int b,int c){    memset(visit,0,sizeof(visit));    node node1,node2;    queue<node>q;    node1.x=a;    node1.y=b;    node1.z=c;    node1.time=0;    q.push(node1);    visit[node1.x][node1.y][node1.z]=1;    while(!q.empty())    {        node2=q.front();        q.pop();        if(node2.x==A-1&&node2.y==B-1&&node2.z==C-1&&node2.time<=T)        {            printf("%d\n",node2.time);            return;        }        node1.x=node2.x+1;        node1.y=node2.y;        node1.z=node2.z;        if(!visit[node1.x][node1.y][node1.z]&&map[node1.x][node1.y][node1.z]==0&&node1.x>=0&&node1.x<A&&node1.y>=0&&node1.y<B&&node1.z>=0&&node1.z<C)        {            node1.time=node2.time+1;            q.push(node1);            visit[node1.x][node1.y][node1.z]=1;        }        node1.x=node2.x-1;        node1.y=node2.y;        node1.z=node2.z;        if(!visit[node1.x][node1.y][node1.z]&&map[node1.x][node1.y][node1.z]==0&&node1.x>=0&&node1.x<A&&node1.y>=0&&node1.y<B&&node1.z>=0&&node1.z<C)        {            node1.time=node2.time+1;            q.push(node1);            visit[node1.x][node1.y][node1.z]=1;        }        node1.x=node2.x;        node1.y=node2.y+1;        node1.z=node2.z;        if(!visit[node1.x][node1.y][node1.z]&&map[node1.x][node1.y][node1.z]==0&&node1.x>=0&&node1.x<A&&node1.y>=0&&node1.y<B&&node1.z>=0&&node1.z<C)        {            node1.time=node2.time+1;            q.push(node1);            visit[node1.x][node1.y][node1.z]=1;        }        node1.x=node2.x;        node1.y=node2.y-1;        node1.z=node2.z;        if(!visit[node1.x][node1.y][node1.z]&&map[node1.x][node1.y][node1.z]==0&&node1.x>=0&&node1.x<A&&node1.y>=0&&node1.y<B&&node1.z>=0&&node1.z<C)        {            node1.time=node2.time+1;            q.push(node1);            visit[node1.x][node1.y][node1.z]=1;        }        node1.x=node2.x;        node1.y=node2.y;        node1.z=node2.z+1;        if(!visit[node1.x][node1.y][node1.z]&&map[node1.x][node1.y][node1.z]==0&&node1.x>=0&&node1.x<A&&node1.y>=0&&node1.y<B&&node1.z>=0&&node1.z<C)        {            node1.time=node2.time+1;            q.push(node1);            visit[node1.x][node1.y][node1.z]=1;        }        node1.x=node2.x;        node1.y=node2.y;        node1.z=node2.z-1;        if(!visit[node1.x][node1.y][node1.z]&&map[node1.x][node1.y][node1.z]==0&&node1.x>=0&&node1.x<A&&node1.y>=0&&node1.y<B&&node1.z>=0&&node1.z<C)        {            node1.time=node2.time+1;            q.push(node1);            visit[node1.x][node1.y][node1.z]=1;        }    }    printf("-1\n");}int main(){    int icase;    scanf("%d",&icase);    while(icase--)    {        scanf("%d%d%d%d",&A,&B,&C,&T);        for(int i=0;i<A;i++)          for(int j=0;j<B;j++)            for(int k=0;k<C;k++)              scanf("%d",&map[i][j][k]) ;        bfs(0,0,0);    }    return 0;}

0 0