题目描述
给你一个大小为 n x n 二进制矩阵 grid 。最多只能将一格 0 变成 1 。
返回执行此操作后,grid 中最大的岛屿面积是多少?
岛屿由一组上、下、左、右四个方向相连的 1 形成。
输入描述
第一行两个整数n和m,(n、m<=300),分别代表地图的行数和列数。
接下来n行,每行m个数字,表示该地图。
输出描述
一个整数,表示最大的岛屿面积。
输入样例
2 2
1 0
0 1
输出样例
3
//参考答案
#include <iostream>
using namespace std;
int n, m, ans, movx[4] = {0, 0, 1, -1}, movy[4] = {1, -1, 0, 0};
int grid[310][310], siz[90010], vis[90010], cnt = 2;
int dfs(int x, int y) {
int ret = 1;
grid[x][y] = cnt;
for (int i = 0; i < 4; i++)
if (grid[x + movx[i]][y + movy[i]] == 1)
ret += dfs(x + movx[i], y + movy[i]);
return ret;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> grid[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (grid[i][j] == 1) {
siz[cnt] = dfs(i, j);
cnt++;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (grid[i][j] == 0) {
int tmp = 1;
for (int k = 0; k < 4; k++) {
int x = i + movx[k];
int y = j + movy[k];
if (grid[x][y] > 1 && vis[grid[x][y]] == 0) {
tmp += siz[grid[x][y]];
vis[grid[x][y]] = 1;
}
}
for (int k = 0; k < 4; k++)
vis[grid[i + movx[k]][j + movy[k]]]= 0;
ans = max(ans, tmp);
}
cout << ans << endl;
return 0;
}