-
#include<cstdio> #include<cstdlib> #include<iostream> #include<queue> #include<vector> #include<utility> using namespace std; int N, L, R; int a[50][50]; int d[50][50]; bool f[50][50]; int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; int alp = 0; int mon(int a, int b) { int x = a - b; int y = b - a; if (x < 0) return y; else return x; } void bfs(int x, int y, int recent ) { vector<pair<int, int>> v; queue<pair<int, int>> q; q.push(make_pair(x, y)); v.push_back(make_pair(x, y)); int sum = a[x][y]; d[x][y] = recent; f[x][y] = true; while (!q.empty()) { x = q.front().first; y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < N && ny >= 0 && ny < N) { if (f[nx][ny] == false) { int diff = (a[x][y] - a[nx][ny]); if (diff < 0) diff = -1 * diff; if(diff >= L && diff <= R){ d[nx][ny] = recent; f[nx][ny] = true; sum += a[nx][ny]; v.push_back(make_pair(nx, ny)); q.push(make_pair(nx, ny)); } } } } } if (v.size() == 1) { return; } else { for (int i = 0; i < v.size(); i++) { x = v[i].first; y = v[i].second; a[x][y] = sum / v.size(); } } } void initial() { for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { d[i][j] = 0; f[i][j] = false; } } } int main() { scanf("%d %d %d", &N, &L, &R); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &a[i][j]); } } int recent = 0; bool top = false; while (recent < N * N) { recent = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (f[i][j] == false) { bfs(i, j, recent); recent++; } } } if (top == true) alp++; top = true; initial(); } cout << alp<<endl; return 0; }
BFS로 풀이했다, DFS로 해도괜찮았을듯.. 시간이 좀 걸렸던거같은데, 어렵진않았음