转载请注明出处:優 YoU http://user.qzone.qq.com/289065406/blog/1303446571
题目大意:
给出一三维空间的地牢
,
要求求出由字符
'S'
到字符
'E'
的最短路径
移动方向可以是上,下,左,右,前,后,六个方向
每移动一次就耗费一分钟,要求输出最快的走出时间。
不同
L
层的地图,相同
RC
坐标处是连通的
解题思路:
我越看这题就越觉得是 XX 地下城 = =
水题一道,求最短路问题,直接 BFS 得了
开三维数组,每次搜索方向由二维的 4 个方向增加到 6 个,但是方法还是那个方法
没难度
注意若果三维数组恰好开到极限的 30*30*30 是会 RE 的,别替人家电脑省空间,想 AC 就开大点。
值得一提的是。。。这题竟然被那篇经典的 POJ 分类 文章归纳到 DFS 。。。网上发现几个同学还在郁闷地 DFS 。。。。
这里就提示一下大家,凡是看到求最短路,用 DFS 一定很难做出来,一定要 BFS
1
//
Memory Time
2
//
784K 32MS
3
4
#include
<
iostream
>
5
using
namespace
std;
6
7
typedef
class
8
{
9
public
:
10
int
l,r,c;
11
int
depth;
//
树深(分钟)
12
}SE;
13
14
SE s,e;
15
bool
maze[
40
][
40
][
40
];
16
int
shortminute;
17
18
bool
BFS(
int
k,
int
i,
int
j)
19
{
20
bool
vist[
40
][
40
][
40
]
=
{
false
};
21
22
SE queue[
30000
];
23
int
head,tail;
24
queue[head
=
0
].l
=
k;
25
queue[tail
=
0
].r
=
i;
26
queue[
0
].c
=
j;
27
queue[tail
++
].depth
=
1
;
28
29
vist[k][i][j]
=
true
;
30
31
while
(head
<
tail)
32
{
33
SE x
=
queue[head
++
];
34
35
if
(x.l
==
e.l
&&
x.r
==
e.r
&&
x.c
==
e.c)
36
{
37
shortminute
=
x.depth;
38
return
true
;
39
}
40
41
if
(maze[x.l][x.r][x.c
-
1
]
&&
!
vist[x.l][x.r][x.c
-
1
])
//
West
42
{
43
vist[x.l][x.r][x.c
-
1
]
=
true
;
44
queue[tail].l
=
x.l;
45
queue[tail].r
=
x.r;
46
queue[tail].c
=
x.c
-
1
;
47
queue[tail
++
].depth
=
x.depth
+
1
;
48
}
49
if
(maze[x.l][x.r
-
1
][x.c]
&&
!
vist[x.l][x.r
-
1
][x.c])
//
North
50
{
51
vist[x.l][x.r
-
1
][x.c]
=
true
;
52
queue[tail].l
=
x.l;
53
queue[tail].r
=
x.r
-
1
;
54
queue[tail].c
=
x.c;
55
queue[tail
++
].depth
=
x.depth
+
1
;
56
}
57
if
(maze[x.l][x.r][x.c
+
1
]
&&
!
vist[x.l][x.r][x.c
+
1
])
//
East
58
{
59
vist[x.l][x.r][x.c
+
1
]
=
true
;
60
queue[tail].l
=
x.l;
61
queue[tail].r
=
x.r;
62
queue[tail].c
=
x.c
+
1
;
63
queue[tail
++
].depth
=
x.depth
+
1
;
64
}
65
if
(maze[x.l][x.r
+
1
][x.c]
&&
!
vist[x.l][x.r
+
1
][x.c])
//
South
66
{
67
vist[x.l][x.r
+
1
][x.c]
=
true
;
68
queue[tail].l
=
x.l;
69
queue[tail].r
=
x.r
+
1
;
70
queue[tail].c
=
x.c;
71
queue[tail
++
].depth
=
x.depth
+
1
;
72
}
73
if
(maze[x.l
-
1
][x.r][x.c]
&&
!
vist[x.l
-
1
][x.r][x.c])
//
Up
74
{
75
vist[x.l
-
1
][x.r][x.c]
=
true
;
76
queue[tail].l
=
x.l
-
1
;
77
queue[tail].r
=
x.r;
78
queue[tail].c
=
x.c;
79
queue[tail
++
].depth
=
x.depth
+
1
;
80
}
81
if
(maze[x.l
+
1
][x.r][x.c]
&&
!
vist[x.l
+
1
][x.r][x.c])
//
Down
82
{
83
vist[x.l
+
1
][x.r][x.c]
=
true
;
84
queue[tail].l
=
x.l
+
1
;
85
queue[tail].r
=
x.r;
86
queue[tail].c
=
x.c;
87
queue[tail
++
].depth
=
x.depth
+
1
;
88
}
89
}
90
return
false
;
91
}
92
93
int
main(
int
i,
int
j,
int
k)
94
{
95
int
L,R,C;
96
while
(cin
>>
L
>>
R
>>
C)
97
{
98
if
(
!
L
&&
!
R
&&
!
C)
99
break
;
100
101
/*
Initial
*/
102
103
memset(maze,
false
,
sizeof
(maze));
104
105
/*
Structure the Maze
*/
106
107
for
(k
=
1
;k
<=
L;k
++
)
108
for
(i
=
1
;i
<=
R;i
++
)
109
for
(j
=
1
;j
<=
C;j
++
)
110
{
111
char
temp;
112
cin
>>
temp;
113
if
(temp
==
'
.
'
)
114
maze[k][i][j]
=
true
;
115
if
(temp
==
'
S
'
)
116
{
117
maze[k][i][j]
=
true
;
118
s.l
=
k;
119
s.r
=
i;
120
s.c
=
j;
121
}
122
if
(temp
==
'
E
'
)
123
{
124
maze[k][i][j]
=
true
;
125
e.l
=
k;
126
e.r
=
i;
127
e.c
=
j;
128
}
129
}
130
131
/*
Search the min Minute
*/
132
133
if
(BFS(s.l,s.r,s.c))
134
cout
<<
"
Escaped in
"
<<
shortminute
-
1
<<
"
minute(s).
"
<<
endl;
135
else
136
cout
<<
"
Trapped!
"
<<
endl;
137
138
}
139
return
0
;
140
}

