BOJ 7569. ν λ§ν
πββοΈ[Gold V] ν λ§ν - 7569
μ±λ₯ μμ½
λ©λͺ¨λ¦¬: 12368 KB, μκ°: 132 ms
λΆλ₯
λλΉ μ°μ νμ, κ·Έλν μ΄λ‘ , κ·Έλν νμ
μ μΆ μΌμ
2024λ 1μ 12μΌ 12:42:17
λ¬Έμ μ€λͺ
μ² μμ ν λ§ν λμ₯μμλ ν λ§ν λ₯Ό 보κ΄νλ ν° μ°½κ³ λ₯Ό κ°μ§κ³ μλ€. ν λ§ν λ μλμ κ·Έλ¦Όκ³Ό κ°μ΄ 격μλͺ¨μ μμμ μΉΈμ νλμ© λ£μ λ€μ, μμλ€μ μμ§μΌλ‘ μμ μ¬λ €μ μ°½κ³ μ 보κ΄νλ€.
μ°½κ³ μ 보κ΄λλ ν λ§ν λ€ μ€μλ μ μ΅μ κ²λ μμ§λ§, μμ§ μ΅μ§ μμ ν λ§ν λ€λ μμ μ μλ€. λ³΄κ΄ ν νλ£¨κ° μ§λλ©΄, μ΅μ ν λ§ν λ€μ μΈμ ν κ³³μ μλ μ΅μ§ μμ ν λ§ν λ€μ μ΅μ ν λ§ν μ μν₯μ λ°μ μ΅κ² λλ€. νλμ ν λ§ν μ μΈμ ν κ³³μ μ, μλ, μΌμͺ½, μ€λ₯Έμͺ½, μ, λ€ μ¬μ― λ°©ν₯μ μλ ν λ§ν λ₯Ό μλ―Ένλ€. λκ°μ λ°©ν₯μ μλ ν λ§ν λ€μκ²λ μν₯μ μ£Όμ§ λͺ»νλ©°, ν λ§ν κ° νΌμ μ μ λ‘ μ΅λ κ²½μ°λ μλ€κ³ κ°μ νλ€. μ² μλ μ°½κ³ μ 보κ΄λ ν λ§ν λ€μ΄ λ©°μΉ μ΄ μ§λλ©΄ λ€ μ΅κ² λλμ§ κ·Έ μ΅μ μΌμλ₯Ό μκ³ μΆμ΄ νλ€.
ν λ§ν λ₯Ό μ°½κ³ μ 보κ΄νλ 격μλͺ¨μμ μμλ€μ ν¬κΈ°μ μ΅μ ν λ§ν λ€κ³Ό μ΅μ§ μμ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ‘μ λ, λ©°μΉ μ΄ μ§λλ©΄ ν λ§ν λ€μ΄ λͺ¨λ μ΅λμ§, κ·Έ μ΅μ μΌμλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ. λ¨, μμμ μΌλΆ μΉΈμλ ν λ§ν κ° λ€μ΄μμ§ μμ μλ μλ€.
μ λ ₯
첫 μ€μλ μμμ ν¬κΈ°λ₯Ό λνλ΄λ λ μ μ M,Nκ³Ό μμμ¬λ €μ§λ μμμ μλ₯Ό λνλ΄λ Hκ° μ£Όμ΄μ§λ€. Mμ μμμ κ°λ‘ μΉΈμ μ, Nμ μμμ μΈλ‘ μΉΈμ μλ₯Ό λνλΈλ€. λ¨, 2 β€ M β€ 100, 2 β€ N β€ 100, 1 β€ H β€ 100 μ΄λ€. λμ§Έ μ€λΆν°λ κ°μ₯ λ°μ μμλΆν° κ°μ₯ μμ μμκΉμ§μ μ μ₯λ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ§λ€. μ¦, λμ§Έ μ€λΆν° Nκ°μ μ€μλ νλμ μμμ λ΄κΈ΄ ν λ§ν μ μ λ³΄κ° μ£Όμ΄μ§λ€. κ° μ€μλ μμ κ°λ‘μ€μ λ€μ΄μλ ν λ§ν λ€μ μνκ° Mκ°μ μ μλ‘ μ£Όμ΄μ§λ€. μ μ 1μ μ΅μ ν λ§ν , μ μ 0 μ μ΅μ§ μμ ν λ§ν , μ μ -1μ ν λ§ν κ° λ€μ΄μμ§ μμ μΉΈμ λνλΈλ€. μ΄λ¬ν Nκ°μ μ€μ΄ Hλ² λ°λ³΅νμ¬ μ£Όμ΄μ§λ€.
ν λ§ν κ° νλ μ΄μ μλ κ²½μ°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
μΆλ ₯
μ¬λ¬λΆμ ν λ§ν κ° λͺ¨λ μ΅μ λκΉμ§ μ΅μ λ©°μΉ μ΄ κ±Έλ¦¬λμ§λ₯Ό κ³μ°ν΄μ μΆλ ₯ν΄μΌ νλ€. λ§μ½, μ μ₯λ λλΆν° λͺ¨λ ν λ§ν κ° μ΅μ΄μλ μνμ΄λ©΄ 0μ μΆλ ₯ν΄μΌ νκ³ , ν λ§ν κ° λͺ¨λ μ΅μ§λ λͺ»νλ μν©μ΄λ©΄ -1μ μΆλ ₯ν΄μΌ νλ€.
πνμ΄
BFSλ¬Έμ λ‘ μ΄μ μ νμλ λ°©μμ κ·Έλλ‘ μ¬μ©νλ©΄ λλ€.
μ΄μ μ disλ°°μ΄μ λ§λ€μ΄μ νλλ° μ΄λ²μ discoveredλ°°μ΄μ λ§λ€μ΄μ λ°κ²¬κ³Ό 거리λ₯Ό λμμ κ³μ°νλ€.
int dy[] = { -1, 0, 1, 0, 0, 0 };
int dx[] = { 0, 1, 0, -1, 0, 0 };
int dz[] = { 0, 0, 0, 0, 1, -1 };
void solve()
{
//discovered[z][y][x] = 1;
while (q.empty() == false)
{
Pos here = q.front();
q.pop();
for (int i = 0; i < 6; ++i)
{
int nz = here.z + dz[i];
int ny = here.y + dy[i];
int nx = here.x + dx[i];
if (nz < 1 || ny < 1 || nx < 1 || nz > h || ny > n || nx > m)
continue;
if (discovered[nz][ny][nx] >= 1)
continue;
if (board[nz][ny][nx] == -1)
continue;
if (board[nz][ny][nx] == 1)
continue;
discovered[nz][ny][nx] = discovered[here.z][here.y][here.x] + 1;
q.push({ nz, ny, nx });
}
}
//for (int i = 1; i <= h; ++i)
//{
// for (int j = 1; j <= n; ++j)
// {
// for (int k = 1; k <= m; ++k)
// {
// cout << discovered[i][j][k];
// }
// cout << endl;
// }
//}
bool flag = false;
int res = 0;
for (int i = 1; i <= h; ++i)
{
for (int j = 1; j <= n; ++j)
{
for (int k = 1; k <= m; ++k)
{
if (discovered[i][j][k] == 0 && board[i][j][k] != -1)
{
flag = true;
cout << -1 << '\n';
return;
}
res = max(res, discovered[i][j][k]);
}
}
}
cout << res - 1;
}
3μ°¨μ 곡κ°μ΄λ―λ‘ dx, dy, dzλ₯Ό λ§λ€μ΄μ νμλ€.
μ£Όμμ κ²°κ³Όλ₯Ό λ³΄κ³ μΆμ΄μ λ£μ μ½λμ΄λ€.
πμ 체 μ½λ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct Pos
{
int z, y, x;
};
int m, n, h;
vector<vector<vector<int>>> board;
vector<vector<vector<int>>> discovered;
queue<Pos> q;
void setting()
{
cin >> m >> n >> h;
board = vector<vector<vector<int>>>(h + 1, vector<vector<int>>(n + 1, vector<int>(m + 1)));
discovered = vector<vector<vector<int>>>(h + 1, vector<vector<int>>(n + 1, vector<int>(m + 1)));
for (int i = 1; i <= h; ++i)
{
for (int j = 1; j <= n; ++j)
{
for (int k = 1; k <= m; ++k)
{
cin >> board[i][j][k];
if (board[i][j][k] == 1)
{
q.push({ i, j, k });
discovered[i][j][k] = 1;
}
}
}
}
}
int dy[] = { -1, 0, 1, 0, 0, 0 };
int dx[] = { 0, 1, 0, -1, 0, 0 };
int dz[] = { 0, 0, 0, 0, 1, -1 };
void solve()
{
//discovered[z][y][x] = 1;
while (q.empty() == false)
{
Pos here = q.front();
q.pop();
for (int i = 0; i < 6; ++i)
{
int nz = here.z + dz[i];
int ny = here.y + dy[i];
int nx = here.x + dx[i];
if (nz < 1 || ny < 1 || nx < 1 || nz > h || ny > n || nx > m)
continue;
if (discovered[nz][ny][nx] >= 1)
continue;
if (board[nz][ny][nx] == -1)
continue;
if (board[nz][ny][nx] == 1)
continue;
discovered[nz][ny][nx] = discovered[here.z][here.y][here.x] + 1;
q.push({ nz, ny, nx });
}
}
//for (int i = 1; i <= h; ++i)
//{
// for (int j = 1; j <= n; ++j)
// {
// for (int k = 1; k <= m; ++k)
// {
// cout << discovered[i][j][k];
// }
// cout << endl;
// }
//}
bool flag = false;
int res = 0;
for (int i = 1; i <= h; ++i)
{
for (int j = 1; j <= n; ++j)
{
for (int k = 1; k <= m; ++k)
{
if (discovered[i][j][k] == 0 && board[i][j][k] != -1)
{
flag = true;
cout << -1 << '\n';
return;
}
res = max(res, discovered[i][j][k]);
}
}
}
cout << res - 1;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}