B - Xiper的奇妙歷險(2)
Time Limit: 3000/1000MS (Java/Others)
題目鏈接:
http://acm.uestc.edu.cn/#/contest/show/99
題目:
轉眼間,已經過了10年。
畢業之後,
久而久之,
日天面對
然而就在
“我不做人啦,
潘警官趕忙掏出光劍,向日天砍去。不料成爲鹹魚王的日天已然是刀槍不入,毫髮無損。
面對強大的日天,
在
現在,已經打敗了日天的
爲了簡化問題,我們將房子簡化成一個
.—— 表示該位置爲空。
x—— 表示該位置上有障礙,不能移動。
U—— 表示上樓的樓梯入口。
D—— 表示下樓的樓梯入口。
X—— 表示
Y —— 表示
每秒
保證頂樓沒有上樓入口,底層沒有下樓入口,每個下樓入口對應的出口只會是上樓入口或者障礙,反之亦然。
一個上樓入口只會對應一個下樓入口,且所在層數相鄰,所處的行和列一致,反之亦然。
注意,同一層樓可能存在多個樓梯;當樓梯入口對應的出口被障礙堵住時,
現在
Input
第一行三個數字
接下來從第
Output
如果可以到達,輸出一個數
Sample Input
1 1 2
XY
1
2 2 2
YU
..
XD
xx
Sample Output
3
分析:
題目大概就是有第三維迷宮了,要從X走到Y,如果下樓或上樓的時候遇到障礙則走不到終點。
三維bfs~
代碼:
#include<cstdio>
#include<queue>
using namespace std;
int n, l, r;
const int maxn = 51;
struct node
{
int x, y, z;
};
node make_node(int a, int b, int c)
{
node tmp;
tmp.x = a;
tmp.y = b;
tmp.z = c;
return tmp;
}
node st, en;
int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };
int d[maxn][maxn][maxn];
char mp[maxn][maxn][maxn];
void init()
{
for (int i = 0; i<51; i++)
for (int j = 0; j<51; j++)
for (int k = 0; k<51; k++)
d[i][j][k] = -1;
}
int bfs()///it has begin and end
{
init();
queue<node>que;
que.push(st);
d[st.z][st.x][st.y] = 0;
while (!que.empty())
{
node p = que.front();
que.pop();
if (mp[p.z][p.x][p.y] == 'Y')break;
for (int i = 0; i<4; i++)
{
int nx = p.x + dx[i], ny = p.y + dy[i];
if (nx >= 0 && nx<l&&ny >= 0 && ny <= r&&d[p.z][nx][ny] == -1 && mp[p.z][nx][ny] != 'x')
{
d[p.z][nx][ny] = d[p.z][p.x][p.y] + 1;
que.push(make_node(nx, ny, p.z));
}
}
if (mp[p.z][p.x][p.y] == 'U'&&p.z + 1<n&&mp[p.z + 1][p.x][p.y] != 'x'&&d[p.z + 1][p.x][p.y] == -1){
d[p.z + 1][p.x][p.y] = d[p.z][p.x][p.y] + 1;
que.push(make_node(p.x, p.y, p.z + 1));
}
if (mp[p.z][p.x][p.y] == 'D'&&p.z - 1 >= 0 && mp[p.z - 1][p.x][p.y] != 'x'&&d[p.z - 1][p.x][p.y] == -1){
d[p.z - 1][p.x][p.y] = d[p.z][p.x][p.y] + 1;
que.push(make_node(p.x, p.y, p.z - 1));
}
}
return d[en.z][en.x][en.y];
}
int main()
{
while (~scanf("%d%d%d", &n, &l, &r))
{
for (int i = 0; i<n; i++)
for (int j = 0; j<l; j++)
for (int k = 0; k<r; k++){
scanf("%c", &mp[i][j][k]);
if (mp[i][j][k] == 'X')
{
st.z = i; st.x = j; st.y = k;
}
if (mp[i][j][k] == 'Y')
{
en.z = i; en.x = j; en.y = k;
}
}
int ans = bfs();
printf("%d\n", ans);
}
}