Untitled
unknown
plain_text
a year ago
2.3 kB
6
Indexable
#include <iostream> #define MAX_N 100 using namespace std; int N; int matrix[MAX_N][MAX_N]; bool visited[MAX_N][MAX_N]; const int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; void initVisited() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { visited[i][j] = false; } } } bool isValid(int x, int y) { return x >= 0 && x < N && y >= 0 && y < N; } int dfs(int x, int y, int value) { visited[x][y] = true; int size = 1; for (int i = 0; i < 4; i++) { int nx = x + directions[i][0]; int ny = y + directions[i][1]; if (isValid(nx, ny) && !visited[nx][ny] && matrix[nx][ny] == value) { size += dfs(nx, ny, value); } } return size; } void findLargestRegion(int x, int y, int &maxValue, int &maxSize) { initVisited(); maxValue = 0; maxSize = 0; bool localVisited[MAX_N][MAX_N] = {false}; for (int i = 0; i < 4; i++) { int nx = x + directions[i][0]; int ny = y + directions[i][1]; if (isValid(nx, ny) && matrix[nx][ny] != 0 && !localVisited[nx][ny]) { initVisited(); int size = dfs(nx, ny, matrix[nx][ny]); localVisited[nx][ny] = true; if (size > maxSize || (size == maxSize && matrix[nx][ny] > maxValue)) { maxSize = size; maxValue = matrix[nx][ny]; } } } } void mergeZeros() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (matrix[i][j] == 0) { int maxValue, maxSize; findLargestRegion(i, j, maxValue, maxSize); if (maxValue > 0) { matrix[i][j] = maxValue; } } } } } int countRegions() { initVisited(); int regions = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (!visited[i][j]) { dfs(i, j, matrix[i][j]); regions++; } } } return regions; } int main() { cin >> N; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> matrix[i][j]; } } mergeZeros(); int regions = countRegions(); cout << regions << endl; return 0; }
Editor is loading...
Leave a Comment