- toc {:toc}
λ¬Έμ
μ² μμ ν λ§ν λμ₯μμλ ν λ§ν λ₯Ό 보κ΄νλ ν° μ°½κ³ λ₯Ό κ°μ§κ³ μλ€. ν λ§ν λ μλμ κ·Έλ¦Όκ³Ό κ°μ΄ 격μλͺ¨μ μμμ μΉΈμ νλμ© λ£μ λ€μ, μμλ€μ μμ§μΌλ‘ μμ μ¬λ €μ μ°½κ³ μ 보κ΄νλ€.
https://upload.acmicpc.net/c3f3343d-c291-40a9-9fe3-59f792a8cae9/-/preview/
μ°½κ³ μ 보κ΄λλ ν λ§ν λ€ μ€μλ μ μ΅μ κ²λ μμ§λ§, μμ§ μ΅μ§ μμ ν λ§ν λ€λ μμ μ μλ€. λ³΄κ΄ ν νλ£¨κ° μ§λλ©΄, μ΅μ ν λ§ν λ€μ μΈμ ν κ³³μ μλ μ΅μ§ μμ ν λ§ν λ€μ μ΅μ ν λ§ν μ μν₯μ λ°μ μ΅κ² λλ€. νλμ ν λ§ν μ μΈμ ν κ³³μ μ, μλ, μΌμͺ½, μ€λ₯Έμͺ½, μ, λ€ μ¬μ― λ°©ν₯μ μλ ν λ§ν λ₯Ό μλ―Ένλ€. λκ°μ λ°©ν₯μ μλ ν λ§ν λ€μκ²λ μν₯μ μ£Όμ§ λͺ»νλ©°, ν λ§ν κ° νΌμ μ μ λ‘ μ΅λ κ²½μ°λ μλ€κ³ κ°μ νλ€. μ² μλ μ°½κ³ μ 보κ΄λ ν λ§ν λ€μ΄ λ©°μΉ μ΄ μ§λλ©΄ λ€ μ΅κ² λλμ§ κ·Έ μ΅μ μΌμλ₯Ό μκ³ μΆμ΄ νλ€.
ν λ§ν λ₯Ό μ°½κ³ μ 보κ΄νλ 격μλͺ¨μμ μμλ€μ ν¬κΈ°μ μ΅μ ν λ§ν λ€κ³Ό μ΅μ§ μμ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ‘μ λ, λ©°μΉ μ΄ μ§λλ©΄ ν λ§ν λ€μ΄ λͺ¨λ μ΅λμ§, κ·Έ μ΅μ μΌμλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ. λ¨, μμμ μΌλΆ μΉΈμλ ν λ§ν κ° λ€μ΄μμ§ μμ μλ μλ€.
μ λ ₯
첫 μ€μλ μμμ ν¬κΈ°λ₯Ό λνλ΄λ λ μ μ M,Nκ³Ό μμμ¬λ €μ§λ μμμ μλ₯Ό λνλ΄λ Hκ° μ£Όμ΄μ§λ€. Mμ μμμ κ°λ‘ μΉΈμ μ, Nμ μμμ μΈλ‘ μΉΈμ μλ₯Ό λνλΈλ€. λ¨, 2 β€ M β€ 100, 2 β€ N β€ 100, 1 β€ H β€ 100 μ΄λ€. λμ§Έ μ€λΆν°λ κ°μ₯ λ°μ μμλΆν° κ°μ₯ μμ μμκΉμ§μ μ μ₯λ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ§λ€. μ¦, λμ§Έ μ€λΆν° Nκ°μ μ€μλ νλμ μμμ λ΄κΈ΄ ν λ§ν μ μ λ³΄κ° μ£Όμ΄μ§λ€. κ° μ€μλ μμ κ°λ‘μ€μ λ€μ΄μλ ν λ§ν λ€μ μνκ° Mκ°μ μ μλ‘ μ£Όμ΄μ§λ€. μ μ 1μ μ΅μ ν λ§ν , μ μ 0 μ μ΅μ§ μμ ν λ§ν , μ μ -1μ ν λ§ν κ° λ€μ΄μμ§ μμ μΉΈμ λνλΈλ€. μ΄λ¬ν Nκ°μ μ€μ΄ Hλ² λ°λ³΅νμ¬ μ£Όμ΄μ§λ€. ν λ§ν κ° νλ μ΄μ μλ κ²½μ°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
μΆλ ₯
μ¬λ¬λΆμ ν λ§ν κ° λͺ¨λ μ΅μ λκΉμ§ μ΅μ λ©°μΉ μ΄ κ±Έλ¦¬λμ§λ₯Ό κ³μ°ν΄μ μΆλ ₯ν΄μΌ νλ€. λ§μ½, μ μ₯λ λλΆν° λͺ¨λ ν λ§ν κ° μ΅μ΄μλ μνμ΄λ©΄ 0μ μΆλ ₯ν΄μΌ νκ³ , ν λ§ν κ° λͺ¨λ μ΅μ§λ λͺ»νλ μν©μ΄λ©΄ -1μ μΆλ ₯ν΄μΌ νλ€.
μΆμ²:https://www.acmicpc.net/problem/7569
νμ΄
2022-08-06 νμ΄
tuple μ μ¬μ©μ μ΅μν΄μ§ νμκ° μλ€.
- 2κ° μλ£λ₯Ό μ¬μ©ν λλ pairλ₯Ό μ¬μ©νμ¬ λ¬Άμ μ μμμ§λ§ 3κ° μ΄μμ μλ£λ₯Ό μ¬μ©ν λλ tupleμ μ΄μ©νμ¬ λ¬Άμ μ μλ€.
- λ§λ€ λ make_tuple, κ°μ κΊΌλΌ λ get<>(μλ£λͺ ) ννλ‘ μ¬μ©νλ€.
- 3μ°¨μμΌλ‘ μ μνλ€λ³΄λ μΈλ±μ€ μ μ©μν¬ λ μ€μν νλ₯ μ΄ λμμ§λ€.
μΌμ ν κΈ°μ€μ λκ³ μΈλ±μ€ μ€μ μ νλλ‘ μ°μ΅ν΄μΌ νλ€.
#include <bits/stdc++.h>
using namespace std;
int dist[102][102][102];
int board[102][102][102];
int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = {0, 0, -1, 1, 0, 0};
int dz[6] = {0, 0, 0, 0, -1, 1};
int m, n, h;
queue<tuple<int, int, int>> q;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> m >> n >> h;
// μ΄κΈ°μ μ΅μ ν λ§ν νμΈ
for(int i = 0; i < h; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < m; k++){
int temp;
cin >> temp;
board[i][j][k] = temp;
if(board[i][j][k]== 0){
dist[i][j][k] = -1;
}
if(board[i][j][k] == 1)
q.push({j, k, i});
}
}
}
// dist, board νμΈμ©
/*
for(int i = 0; i < h; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < m; k++){
cout << dist[i][j][k];
}
cout << endl;
}
cout << endl << endl;
}
for(int i = 0; i < h; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < m; k++){
cout << board[i][j][k];
}
cout << endl;
}
cout << endl << endl;
}
*/
// bfs
for(int i = 0; i < h; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < m; k++){
while(!q.empty()){
auto cur = q.front(); q.pop();
for(int dir = 0; dir < 6; dir++){
int nx = get<0>(cur) + dx[dir];
int ny = get<1>(cur) + dy[dir];
int nz = get<2>(cur) + dz[dir];
if(nx < 0 || nx >= n || ny < 0 || ny >= m || nz < 0 || nz >= h) continue;
if(dist[nz][nx][ny] >= 0 || board[nz][nx][ny] == -1) continue;
dist[nz][nx][ny] = dist[get<2>(cur)][get<0>(cur)][get<1>(cur)] + 1;
q.push({nx, ny, nz});
}
}
}
}
}
int ans = 0;
for(int i = 0; i < h; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < m; k++){
if(dist[i][j][k] == -1){
cout << -1;
return 0;
}
ans = max(ans, dist[i][j][k]);
}
}
}
cout << ans << endl;
}2023-09-08 νμ΄
μ΄μ μ λ€λ₯Έ νμ΄λ€μ μ΄ν΄λ³΄λ©΄ λ°°μ΄μ μΈλ±μ€λ₯Ό xλ κ°λ‘, yλ μΈλ‘μΆμ΄λΌ μκ°νμ λ, 무ν±λκ³ μλ μλͺ»λ μΈλ±μ€ νκΈ°μ²λΌ x, y μμλ‘ μ¬μ©νλ€. νμ§λ§ μ΄ μμλ 2μ°¨μμ΄μκΈ°μ xκ° μΈλ‘μΆ, yκ° κ°λ‘μΆ μν μ νμ¬ μ μ μλν κ²μ΄μ§ μ¬λ°λ₯΄μ§ μμ νκΈ°μ΄λ€. λλ¬Έμ, μ¬λ°λ₯Έ νκΈ°μ κ°μ΄ μΈλ±μ€λ₯Ό μ¬μ©ν΄μΌ νλ€.
νΉν, μ°¨μμ΄ μ¬λΌκ°μλ‘ μ μ₯νλ μΈλ±μ€ νκΈ°κ° μ€μνκΈ° λλ¬Έμ μ μν΄μ νμ΄νλ€.
μλ νμ΄μμλ tupleμ μ¬μ©νλλ° μ΄λ²μλ ꡬ쑰체λ₯Ό μ¬μ©ν΄ νμ΄ν΄λ΄€λ€. tupleλ‘ λ§λ€ λλ λ§μ°¬κ°μ§μ§λ§, ꡬ쑰체λ₯Ό λ§λ€ λλ x, y, zμ μμμ μ£Όμνλ€.
board[x][y] // μλͺ»λ μΈλ±μ€ νκΈ°
board[y][x] // μλ―Έμ μ¬λ°λ₯Έ νκΈ°
board[z][y][x] // 3μ°¨μμμμ μ¬λ°λ₯Έ μΈλ±μ€ νκΈ°#include <bits/stdc++.h>
using namespace std;
struct point{
int z;
int y;
int x;
};
int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = {0, 0, -1, 1, 0, 0};
int dz[6] = {0, 0, 0, 0, -1, 1};
int M, N, H;
int board[101][101][101];
queue<point> q;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> M >> N >> H;
for(int i = 0; i < H; i++){
for(int j = 0; j < N; j++){
for(int k = 0; k < M; k++){
cin >> board[i][j][k];
if(board[i][j][k] == 1){
q.push({i, j, k});
}
}
}
}
int res = 0;
while(!q.empty()){
point cur = q.front(); q.pop();
for(int dir = 0; dir < 6; dir++){
int nx = cur.x + dx[dir];
int ny = cur.y + dy[dir];
int nz = cur.z + dz[dir];
if(nx < 0 || nx >= M || ny < 0 || ny >= N || nz < 0 || nz >= H) continue;
if(board[nz][ny][nx] >= 1 || board[nz][ny][nx] == -1) continue;
q.push({nz, ny, nx});
board[nz][ny][nx] = board[cur.z][cur.y][cur.x] + 1;
}
}
for(int i = 0; i < H; i++){
for(int j = 0; j < N; j++){
for(int k = 0; k < M; k++){
if(board[i][j][k] == 0){
cout << -1 << '\n';
exit(0);
}
if(board[i][j][k] > res){
res = board[i][j][k];
}
}
}
}
cout << res-1 << '\n';
return 0;
}