• Dungeon Master


    这个是一个迷宫问题,首先我们注意到他们的方向,东南西北和上下六个,所以这是一个三维数组所构建的空间立体模型;然后迷宫问题嘛肯定又是bfs遍历,从一个父结点到子结点的依次遍历这里要记得判断是否能成功逃出,然后要保存记录的可以通路的最短路线的节点的信息,所以这里还需要使用队列来记录,数组的话,如果没有确定好容易发生溢出从而导致很多东西都存不进去,最后肯定会出现错误。然后这个遍历的话,要注意相关的判断条件和和行走函数的预判dx[0,0,0,0,1,-1]这个数组主要是为了到时候行走的时候可以保证只走一个方向的节点,通过这整个的dx,dydz的循环就可以确定周围六个方向的通路,然后记录这个走过的点,重新调用自己这个函数,开始递归。在主函数可以通过判断是否通路来减小这个bfs函数的递归调用。减小开销。

    #include<stdio.h>
    #include<queue>
    #include<string.h>
    using namespace std;
    int visit[40][40][40];
    int step[40][40][40];
    int dx[6]= {0,0,0,0,1,-1};
    int dy[6]= {0,0,1,-1,0,0};
    int dz[6]= {1,-1,0,0,0,0};
    int n,m,k,flag;
    struct node
    {
         int x,y,z;
    } start,end;
    int bfs()
    {
         flag=0;
         queue <node> Q;
         Q.push(start);
         node temp;
         visit[start.x][start.y][start.z]=1;
         while(!Q.empty())
         {
             temp=Q.front();
             Q.pop();
             if(temp.x==end.x&&temp.y==end.y&&temp.z==end.z)
             {
                 flag=1;
                 break;         }
             int x=temp.x;
             int y=temp.y;
             int z=temp.z;
        for(int i=0; i<6; i++)
             {
                 if(!visit[z+dz[i]][x+dx[i]][y+dy[i]]&&x+dx[i]<m&&x+dx[i]>=0&&y+dy[i]<k&&y+dy[i]>=0&&z+dz[i]<n&&z+dz[i]>=0)
                 {
                     temp.x=x+dx[i];
                     temp.y=y+dy[i];
                     temp.z=z+dz[i];
                     visit[temp.z][temp.x][temp.y]=1;
                     Q.push(temp);
                     step[temp.x][temp.y][temp.z]=step[x][y][z]+1;
                 }
             }
         }
         return flag;
     }
     int main()
     {
         int i,j,t;
         char ch;
         while(scanf("%d%d%d",&n,&m,&k)!=EOF)
         {
             if(n==0&&m==0&&k==0)
                 break;
             memset(step,0,sizeof(step));
             getchar();
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                 {
                     for(t=0; t<k; t++)
                     {
                         scanf("%c",&ch);
                         if(ch=='.')
                             visit[i][j][t]=0;
                         else if(ch=='#')
                             visit[i][j][t]=1;
                         else if(ch=='S')
                         {
                             visit[i][j][t]=0;
                             start.x=j;
                             start.y=t;
                             start.z=i;
                         }
                         else if(ch=='E')
                         {
                             visit[i][j][t]=0;
                             end.x=j;
                             end.y=t;
                             end.z=i;
                         }
                     }
                     getchar();
                 }
                 if(i!=n-1)
                     getchar();
             }
             if(bfs())
                printf("Escaped in %d minute(s).
    ",step[end.x][end.y][end.z]);
                else
                 printf("Trapped!
    ");
         }
         return 0;
    

      

  • 相关阅读:
    GDI+学习之------色彩与图像
    2015小米暑期实习笔试题_懂二进制(位运算)
    拷贝构造函数和赋值函数
    HDU
    react-router中,<switch>
    Navicat for MySQL
    maven项目创建3 (依赖版本冲突)
    maven项目创建2
    maven项目创建
    Eclipse 开发环境修改及MAVEN配置
  • 原文地址:https://www.cnblogs.com/yintoki/p/5676364.html
Copyright © 2020-2023  润新知