Untitled
unknown
plain_text
10 months ago
2.8 kB
3
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 &maxValue, int &maxSize) { initVisited(); maxValue = 0; maxSize = 0; for (int value = 1; value <= 5; value++) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (!visited[i][j] && matrix[i][j] == value) { int size = dfs(i, j, value); if (size > maxSize || (size == maxSize && value > maxValue)) { maxSize = size; maxValue = value; } } } } } } void mergeZeros() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (matrix[i][j] == 0) { int maxValue, maxSize; initVisited(); maxValue = 0; maxSize = 0; for (int k = 0; k < 4; k++) { int nx = i + directions[k][0]; int ny = j + directions[k][1]; if (isValid(nx, ny) && matrix[nx][ny] != 0) { int size = dfs(nx, ny, matrix[nx][ny]); if (size > maxSize || (size == maxSize && matrix[nx][ny] > maxValue)) { maxSize = size; maxValue = matrix[nx][ny]; } } } 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