๋ฌธ์ :
๋ถ์ :
์ด ๋ฌธ์ ๋ ์๊ฐํ๊ธฐ ๋ณต์กํ์ง๋ง ์ฝ๋๋ฅผ ๋ณด๋ ๋จ์จ์ ์ดํด๊ฐ ๊ฐ๋ ๋ฏ ํ ๋ฌธ์ ์๋ค.
์น์ฆ์ ๊ฒ๋ฉด๋ง ์๊ฐ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๊ณต๊ธฐ๋ก ๋ฐ๊ฟ๊น ๋ฌธ์ ๊ทธ๋๋ก์ ํ๋ฆ์ ๋ฐ๋ผ ๋ฌธ์ ๋ฅผ ํ๋ ค ํ์ง๋ง ๊ทธ๋ ๊ฒ ๋๋ฉด์ ์์ชฝ์ ๊ณต๊ธฐ์ ๋ฐ๊นฅ์ชฝ์ ๊ณต๊ธฐ๊ฐ ๊ตฌ๋ถ์ด ๋์ง ์์ ์์๊ฐ ์๋ง์ด ๋ ์๋ ์์ ๊ฒ ๊ฐ์๋ค.
๊ฐ์ด ์คํฐ๋ ํ๋ ์ธ๋์ ์ฝ๋ ์ค๋ช ์ผ๋ก ์น์ฆ ์ ์ฅ์์๊ฐ ์๋ ๊ณต๊ธฐ ์ ์ฅ์์ ๋ค์ ๊ณต๊ธฐ๊ฐ ๋ ๊ฒ์ธ์ง ์๋์ง ํ๋จํ๋ฉด ์์ชฝ์ ๊ณต๊ธฐ๋ฅผ ์๊ฐํ์ง ์์๋ ๋๋ค๋ ์ ์ด ์ ๊ธฐํ๋ค. ๋ น๋ ์์๋ ๊ณต๊ธฐ์ ๋ฟ๋ ์์์ด๋ฏ๋ก ๋จผ์ ์์ชฝ ๊ณต๊ธฐ๋ฅผ ๋ง๋ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
enum์ ์ฌ์ฉํด์ ๋์ฑ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๋๋ผ ์ต๊ณ ๋ค ์ต๊ณ
find_air ํจ์๊ฐ false๊ฐ ๋ ์กฐ๊ฑด์ ๋จ์์๋ ์น์ฆ๊ฐ ์๋์ง ์๋์ง melt_bfs๋ก ๊ฒ์ฌํ์ฌ ํ๋ณํ๋ค. ํ๋๋ผ๋ 1 cheese๊ฐ ๋จ์์์ ๊ฒฝ์ฐ while๋ฌธ์ ๋๋ฉฐ cheese๋ฅผ ๋ น์ธ๋ค.
c++ ์ฝ๋ :
//
// 2636_cheese.cpp
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2021/04/01.
//
#include <stdio.h>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int arr[101][101];
int visit[101][101];
int cheese_cnt = 0;
int ans = 1;
int M, N;
int dx[] = { 0, 0, 1, -1 }; //up down left right
int dy[] = { 1, -1, 0, 0 };
enum { CHEESE = 1, PREAIR, AIR};
bool melt_bfs(){
bool cleared = true;
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
if(arr[i][j] == PREAIR){
arr[i][j] = AIR; // ๊ณต๊ธฐ๋ก ๋ฐ๊ฟ์ค
}
}
}
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
if(arr[i][j] == CHEESE){//์น์ฆ๊ฐ ์กฐ๊ธ์ด๋ผ๋ ๋จ์๋ค๋ฉด false
cleared = false;
}
}
}
return cleared;
}
bool find_air(){
queue<pair<int, int>> q;
q.push(make_pair(0,0));
memset(visit, false, sizeof(visit));
while(!q.empty()){
int y = q.front().first;
int x = q.front().second;
arr[y][x] = AIR;
q.pop();
for(int i = 0; i < 4; i ++){
int ny = y + dy[i];
int nx = x + dx[i];
if(ny < 0 || nx < 0 || ny >= M || nx >= N || visit[ny][nx])
continue;
if(arr[ny][nx] == CHEESE){ // ๊ทผ์ฒ ์น์ฆ๋ฅผ๋ฐ๊ฒฌํ๋ฉด preair๋ก ๋ฃ์ด์ค๋ค ..!
arr[ny][nx] = PREAIR;
cheese_cnt++;
}else if (arr[ny][nx] == 0 || arr[ny][nx] == AIR){
q.push(make_pair(ny, nx)); // ๊ณต๊ธฐ์ ๋ํด q์ ๋ฃ์ด์ค๋ค.
visit[ny][nx] = true;
}
}
}
return melt_bfs();
}
int main(){
cin >> M >> N;
for(int i = 0; i < M; i++){
int s;
for(int j = 0; j < N; j++){
cin >> s;
arr[i][j] = s;
}
}
// for(int i = 0 ; i < M; i++){ //input ํ์ธ์ฉ
// for(int j = 0; j < N; j++){
// cout << arr[i][j] << " ";
// }
// cout << endl;
// }
while(1){
cheese_cnt = 0;
if(find_air())
break;
ans++;
}
cout << ans << '\n';
cout << cheese_cnt << '\n';
melt_bfs();
return 0;
}
'Algorithm๐ฐ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2309 ์ผ๊ณฑ ๋์์ด backtracking (0) | 2021.04.06 |
---|---|
[๋ฐฑ์ค] 1477 ํด๊ฒ์ ์ธ์ฐ๊ธฐ (0) | 2021.04.05 |
[๋ฐฑ์ค] 14502 ์ฐ๊ตฌ์ bfs (0) | 2021.04.01 |
[๋ฐฑ์ค] 11779 ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ2 dijkstra (0) | 2021.03.10 |
[๋ฐฑ์ค] 1916 ์ต์๋น์ฉ ๊ตฌํ๊ธฐ dijkstra (0) | 2021.03.10 |
๋๊ธ