码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2251 Dungeon Master

时间:2018-06-09 22:07:16      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:int   ==   一个   ++   end   入门   iostream   dex   i++   

题目连接:http://poj.org/problem?id=2251

题目意思看图就能明白,这题的输出格式要小心,因为格式问题(输出换行后还有一行),一直没ac,今天才又仔细看了一遍自己的代码,检查代码确实无误后,再将别人的代码测了下数据,就发现了格式问题。(诶,坑人啊)

这题就是用bfs,我觉得这题可以作为bfs入门的案例题了,一个模板就行了,还有一点结构体;

接下来就是自己的代码了:

 1 #include<iostream>
 2 #include<queue>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 char str[30][30][30];
 7 int visit[30][30][30];//每个位子访问状态,1表示可访问,0不可走或已走; 
 8 int a,b,c; 
 9 int xx[6]={1,-1,0,0,0,0},yy[6]={0,0,1,-1,0,0},zz[6]={0,0,0,0,1,-1};//6个方向,上,下,前,后,左,右; 
10 
11  struct lpl
12  {
13     int x,y,z;//记录坐标的位子; 
14     int count;//记录到这个位子的步数; 
15  };
16 
17  lpl begin,end,next,now;//起始位子和终点位子;
18 
19  bool vis(int x,int y,int z)//判断每个位子的状态 
20  {
21     if(x<0||x>=a||y<0||y>=b||z<0||z>=c)//越界 
22     return false;
23     else if(visit[x][y][z]==0)//已访问或不可访问状态 
24     return false;
25     else
26     return true;
27  }
28 
29  void bfs(lpl index)
30  {
31      queue<lpl> dui;
32     dui.push(index);
33     while(!dui.empty())
34     {
35         now=dui.front();
36         //visit[now.x][now.y][now.z]=0;
37         for(int i=0;i<6;i++)
38         {
39             if(vis(now.x+xx[i],now.y+yy[i],now.z+zz[i]))
40             {
41                 next.x=now.x+xx[i];
42                 next.y=now.y+yy[i];
43                 next.z=now.z+zz[i];
44                 next.count=now.count+1;
45                 visit[next.x][next.y][next.z]=0;
46                 if(next.x==end.x&&next.y==end.y&&next.z==end.z)
47                  {
48                     end.count=next.count;
49                     return;
50                 }
51                 dui.push(next);
52             }
53         }
54         dui.pop();
55     }
56     return;
57  }
58  
59  int main()
60  {
61      while(cin>>a>>b>>c)
62      {
63          if(a==0&&b==0&&c==0)
64          return 0;
65          //getchar();
66          memset(visit,0,sizeof(visit));
67          for(int i=0;i<a;i++)
68          {
69              for(int j=0;j<b;j++)
70              {
71                  for(int k=0;k<c;k++)
72                  {
73                      cin>>str[i][j][k]; 
74                      if(str[i][j][k]==S)
75                      {
76                          begin.x=i;begin.y=j;begin.z=k;
77                     }
78                     else if(str[i][j][k]==E)
79                     {
80                         end.x=i;end.y=j;end.z=k;
81                         visit[i][j][k]=1;
82                     }
83                     else if(str[i][j][k]==.)
84                     visit[i][j][k]=1;
85                 }
86                 getchar();
87             }
88         }
89         end.count=-1;
90         begin.count=0;
91         bfs(begin);
92         if(end.count==-1)
93         cout<<"Trappled!"<<endl;
94         else
95         cout<<"Escaped in "<<end.count<<" minute(s)."<<endl;
96     }
97     return 0;
98  }

 

POJ 2251 Dungeon Master

标签:int   ==   一个   ++   end   入门   iostream   dex   i++   

原文地址:https://www.cnblogs.com/wwq-19990526/p/9160771.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!