hoj - 1448 题解

题意:三维迷宫,求逃出去的最短时间

题解:用DFS最佳,注意vis存储最短距离

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<climits>
  5 #include<cstring>
  6 using namespace std;
  7 bool map[102][102][102];
  8 int vis[102][102][102];
  9 void dfs(int z,int x,int y)
 10 {
 11     if(vis[z-1][x][y]>vis[z][x][y]+1&&map[z-1][x][y])
 12     {
 13         vis[z-1][x][y]=vis[z][x][y]+1;
 14         dfs(z-1,x,y);
 15     }
 16     if(vis[z+1][x][y]>vis[z][x][y]+1&&map[z+1][x][y])
 17     {
 18         vis[z+1][x][y]=vis[z][x][y]+1;
 19         dfs(z+1,x,y);
 20     }
 21     if(vis[z][x-1][y]>vis[z][x][y]+1&&map[z][x-1][y])
 22     {
 23         vis[z][x-1][y]=vis[z][x][y]+1;
 24         dfs(z,x-1,y);
 25     }
 26     if(vis[z][x+1][y]>vis[z][x][y]+1&&map[z][x+1][y])
 27     {
 28         vis[z][x+1][y]=vis[z][x][y]+1;
 29         dfs(z,x+1,y);
 30     }
 31     if(vis[z][x][y-1]>vis[z][x][y]+1&&map[z][x][y-1])
 32     {
 33         vis[z][x][y-1]=vis[z][x][y]+1;
 34         dfs(z,x,y-1);
 35     }
 36     if(vis[z][x][y+1]>vis[z][x][y]+1&&map[z][x][y+1])
 37     {
 38         vis[z][x][y+1]=vis[z][x][y]+1;
 39         dfs(z,x,y+1);
 40     }
 41     return;
 42 }
 43 int main()
 44 {
 45     int l,n,m;
 46     while(true)
 47     {
 48         scanf("%d%d%d",&l,&n,&m);
 49         if(l==0&&n==0&&m==0)
 50         {
 51             break;
 52         }
 53         memset(map,false,sizeof(map));
 54         for(int i=1;i<=l;i++)
 55         {
 56             for(int j=1;j<=n;j++)
 57             {
 58                 for(int k=1;k<=m;k++)
 59                 {
 60                     vis[i][j][k]=INT_MAX;
 61                 }
 62             }
 63         }
 64         getchar();
 65         int s_x;
 66         int s_y;
 67         int s_z;
 68         int e_x;
 69         int e_y;
 70         int e_z;
 71         for(int i=1;i<=l;i++)
 72         {
 73             for(int j=1;j<=n;j++)
 74             {
 75                 for(int k=1;k<=m;k++)
 76                 {
 77                     char c=getchar();
 78                     if(c=='S')
 79                     {
 80                         s_x=j;
 81                         s_y=k;
 82                         s_z=i;
 83                         map[i][j][k]=true;
 84                     }
 85                     if(c=='E')
 86                     {
 87                         e_x=j;
 88                         e_y=k;
 89                         e_z=i;
 90                         map[i][j][k]=true;
 91                     }
 92                     if(c=='#')
 93                     {
 94                         map[i][j][k]=false;
 95                     }
 96                     if(c=='.')
 97                     {
 98                         map[i][j][k]=true;
 99                     }
100                 }
101                 getchar();
102             }
103             getchar();
104         }
105         vis[s_z][s_x][s_y]=0;
106         dfs(s_z,s_x,s_y);
107         if(vis[e_z][e_x][e_y]!=INT_MAX)
108         {
109             printf("Escaped in %d minute(s).\n",vis[e_z][e_x][e_y]);
110         }
111         else
112         {
113             printf("Trapped!\n");
114         }
115     }
116     return 0;
117 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值