题目来源:827. 最大人工岛 - 力扣(LeetCode)
思路比较简单,用dfs,一开始超时了,只能通过69/75,后面做了一些优化,仅仅只在海岸线进行深搜,并且深搜完毕得出岛屿面积后,在原来海岸线位置上再次深搜进行岛屿还原。
执行用时:1240 ms, 在所有 C 提交中击败了6.00%的用户
内存消耗:19.6 MB, 在所有 C 提交中击败了94.00%的用户
C语言代码如下:
int max;
static void dfs(int** grid, int gridSize, int* gridColSize, int * area, int row, int col)
{
bool flag = false;
//right
if (col < *gridColSize - 1 && grid[row][col + 1] == 1) {
flag = true;
(*area)++;
grid[row][col + 1] = 2;
dfs(grid, gridSize, gridColSize, area, row, col + 1);
}
//down
if (row < gridSize - 1 && grid[row + 1][col] == 1) {
flag = true;
(*area)++;
grid[row + 1][col] = 2;
dfs(grid, gridSize, gridColSize, area, row + 1, col);
}
//left
if (col > 0 && grid[row][col - 1] == 1) {
flag = true;
(*area)++;
grid[row][col - 1] = 2;
dfs(grid, gridSize, gridColSize, area, row, col - 1);
}
//up
if (row > 0 && grid[row - 1][col] == 1) {
flag = true;
(*area)++;
grid[row - 1][col] = 2;
dfs(grid, gridSize, gridColSize, area, row - 1, col);
}
if (!flag) {
max = fmax(max, *area);
}
}
static void func(int** grid, int gridSize, int* gridColSize, int row, int col)
{
//right
if (col < *gridColSize - 1 && grid[row][col + 1] == 2) {
grid[row][col + 1] = 1;
func(grid, gridSize, gridColSize, row, col + 1);
}
//down
if (row < gridSize - 1 && grid[row + 1][col] == 2) {
grid[row + 1][col] = 1;
func(grid, gridSize, gridColSize, row + 1, col);
}
//left
if (col > 0 && grid[row][col - 1] == 2) {
grid[row][col - 1] = 1;
func(grid, gridSize, gridColSize, row, col - 1);
}
//up
if (row > 0 && grid[row - 1][col] == 2) {
grid[row - 1][col] = 1;
func(grid, gridSize, gridColSize, row - 1, col);
}
}
int largestIsland(int** grid, int gridSize, int* gridColSize)
{
bool flag = false;
max = 1;
for (int row = 0; row < gridSize; row++) {
for (int col = 0; col < *gridColSize; col++) {
if (grid[row][col] == 0) {
flag = true;
if ((row > 0 && grid[row - 1][col])
|| (col < *gridColSize - 1 && grid[row][col + 1])
|| (row < gridSize - 1 && grid[row + 1][col])
|| (col > 0 && grid[row][col - 1])) {
int area = 1;
dfs(grid, gridSize, gridColSize, &area, row, col);
func(grid, gridSize, gridColSize, row, col);
}
}
}
}
return (flag ? max : (*gridColSize * gridSize));
}