HDU_1253 대탈출 승리(BFS)

15624 단어 HDU
밤새 고민하고 디테일에 신경 써!!!(문제 풀이 보고서가 를 많이 쓰는 걸 봤는데 STL을 별로 안 좋아해요...)
My Code:
#include <iostream>
#include
<cstdio>
#include
<cstring>

using namespace std;

const int N = 51;

struct node
{
int x;
int y;
int z;
int t;
}q[N
*N*N];

int d[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, -1}, {0, 0, 1}};
int map[N][N][N];
int ans, T, X, Y, Z;

int bfs()
{
int f = 0, r = 0, i;
node p;
map[
0][0][0] = 1;
q[
0].x = 0; q[0].y = 0;
q[
0].z = 0; q[0].t = 0;
while(f <= r)
{
p
= q[f++];

for(i = 0; i < 6; i++)
{
int a = p.x + d[i][0];
int b = p.y + d[i][1];
int c = p.z + d[i][2];
if(a >= 0 && a < X && b >= 0 && b < Y && c >= 0 && c < Z && !map[a][b][c])
{
if(a == X-1 && b == Y-1 && c == Z-1 && p.t+1 <= T)
{
ans
= p.t + 1;
return 1;
}r
++;
map[a][b][c]
= 1;
q[r].x
= a;
q[r].y
= b;
q[r].z
= c;
q[r].t
= p.t+1;
}
}
}
return 0;
}

int main()
{
//freopen("data.in", "r", stdin);
int t, i, j, k;
scanf(
"%d", &t);
while(t--)
{
scanf(
"%d%d%d%d", &X, &Y, &Z, &T);

memset(map,
0, sizeof(map));

for(i = 0; i < X; i++)
for(j = 0; j < Y; j++)
for(k = 0; k < Z; k++)
scanf(
"%d", &map[i][j][k]);
ans
= 0;
if(bfs())
printf(
"%d
", ans);
else
printf(
"-1
");
}
return 0;
}

좋은 웹페이지 즐겨찾기