1 x 1 ๋ชจ์์ ์ฌ๊ฐํ์ด n x n ๋งํผ ํผ์ณ์ง ๋
์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค.
๊ฐ ์ฌ๊ฐํ์ ๋๋ผ๋ฅผ ์ง์นญํ๋ฉฐ ๊ทธ ์์๋ ๋ฐฑ์ฑ๋ค์ ์ซ์๊ฐ ์๋ค.
๋งค์ฐ ์์ ๋ก์ด ์ด ๋๋ฅ์ ํน์ ํ ๋๋ผ๋ ๋ค๋ฅธ ๋๋ผ์ ์ธ๊ตฌ์์ ๋น์ทํ๋ค๋ฉด ์ฐํฉ์ ํ์ฌ ์ฐํฉ๊ตญ ๊ฐ ์ธ๊ตฌ๋ ๊ฐ์ ์ซ์๋ก ์ ์งํ๊ธฐ๋ก ๋ฒ์ ์ ์ ํ๋ค.
์ ๋ฒ์ ์์ ํ ์ํํ๊ธฐ ์ํด ํ์ํ ์ผ ์๋ฅผ ๊ตฌํ์ฌ๋ผ.
๋ผ๊ณ ์๊ฐ ํ๋ฉด ๋จ
์์ธํ ๋ฌธ์ ์ค๋ช ๊ณผ ์ ํ ์ฌํญ์ ๋ฐฑ์ค ํํ์ด์ง ์ฐธ๊ณ . ๋ฌธ์ ํ๋ฌ๊ฐ๊ธฐ
์ค์!!! ํ์ํ ์ผ ์์ด๋ค. ์ด๋ํ ํ ์๊ฐ ์๋๋ค. ๋ค์ ๋งํด ๋์ผํ ๋ ์ ์ฐํฉ์ด ์ฌ๋ฌ๊ฐ ๋ฐ์ํ๋ค ํด๋ ํ๋ฃจ์ ์ผ์ด๋ฌ๊ธฐ ๋๋ฌธ์ ๋ต์ ์ถ๊ฐํ ๋๋ 1์ ์ถ๊ฐํด์ผํ๋ค
๊ฐ ์นธ๋ณ๋ก BFS๋ฅผ ์ํํ๋ฉด ํ ์ ์๋ ๋ฌธ์ .
๋ฐฑ์ค ์ฌ์ดํธ๊ฐ ์๋, visual studio ์์ ์ฝ๋๋ฅผ ์์ฑํด์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฒ ์ ๋๋ค. ์ผ๋ถ ์ฝ๋์๋ ํ ์คํธ ์ฝ๋๊ฐ ์กด์ฌํฉ๋๋ค.
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct Point {
int x;
int y;
};
vector<vector<Point>> group;
vector<vector<int>> myBoard;
vector<vector<bool>> checked;
void dfs(int pre, int x, int y, int low, int high, vector<vector<int>>& myBoard, vector<vector<bool>> &checked);
void flatting(vector<vector<int>>& myBoard);
int main() {
int boardSize;
cin >> boardSize;
int low, high;
cin >> low >> high;
myBoard.assign(boardSize, vector<int>(boardSize,0));
for (int i = 0; i < boardSize; i++)
for (int j = 0; j < boardSize; j++)
cin >> myBoard[i][j];
int answer = 0;
while (true) {
group.clear();
checked.clear();
group.push_back(vector<Point>(0));
checked.assign(boardSize, vector<bool>(boardSize, false));
for (int i = 0; i < boardSize; i++)
{
for (int j = 0; j < boardSize; j++)
{
if (checked[i][j] == true) continue;
dfs(myBoard[i][j], j + 1, i, low, high, myBoard, checked);
dfs(myBoard[i][j], j - 1, i, low, high, myBoard, checked);
dfs(myBoard[i][j], j, i + 1, low, high, myBoard, checked);
dfs(myBoard[i][j], j, i - 1, low, high, myBoard, checked);
if (group[group.size() - 1].size() != 0)
group.push_back(vector<Point>(0));
}
}
flatting(myBoard);
if (group[0].size() == 0) break;
answer++;
}
cout << answer;
}
void dfs(int pre, int x, int y, int low, int high, vector<vector<int>>& myBoard, vector<vector<bool>> &checked) {
if (y < 0 || y >= myBoard.size() || x < 0 || x >= myBoard.size()) return;
if (checked[y][x] == true) return;
int diff = abs(myBoard[y][x] - pre);
if (diff >= low && diff <= high) {
checked[y][x] = true;
group[group.size() - 1].push_back({ x,y });
dfs(myBoard[y][x], x + 1, y, low, high, myBoard, checked);
dfs(myBoard[y][x], x - 1, y, low, high, myBoard, checked);
dfs(myBoard[y][x], x, y + 1, low, high, myBoard, checked);
dfs(myBoard[y][x], x, y - 1, low, high, myBoard, checked);
}
}
void flatting(vector<vector<int>>& myBoard) {
for (int i = 0; i < group.size(); i++)
{
if (group[i].size() == 0) continue;
int flat = 0;
for (int j = 0; j < group[i].size(); j++)
flat += myBoard[group[i][j].y][group[i][j].x];
flat /= group[i].size();
for (int j = 0; j < group[i].size(); j++)
myBoard[group[i][j].y][group[i][j].x] = flat;
}
}
๋ถํ์ํ ๋์๋ ๋ง์ ๊ฒ ๊ฐ์ง๋ง ํ์๋ค๋ ๊ฒ์ ๋ง์กฑํ๊ณ ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ๋ณด์๋ค. ์ญ์ ์ธ์์๋ ์ฒ์ฌ๋ ๋ง๊ณ ๋๋ ๋ฐ๋ณด๋ค.