问题描述
leetcode 827 最大人工岛
使用自己编写的输入输出,头文件只使用#include<iostream>,岛屿改成了正方形地图。
算法描述
一道简单的dfs寻找最大面积题,注意为不同岛屿分组,寻找最大人工岛的时候记得每次寻找后要清空寻找的记录,仅保留最大的记录。
思想还很繁琐,有更好的思路欢迎交流
代码实现
#include <iostream>
using namespace std;
int grid[50][50];
int root[50][50];
int countArea[50];
int num = 0;
int N;
int area;
int maxArea;
int visit[4];
//统计目前陆地面积
void dfssea(int x, int y)
{
//越界
if (x < 0 || y < 0 || x >= N || y >= N)
{
return;
}
if (grid[x][y] == 2)
return;
//海洋
if (grid[x][y] == 0)
{
return;
}
//岛屿
else if (grid[x][y] == 1)
{
grid[x][y] = 2; //grid[][] == 2->已经访问过的陆地
countArea[num]++; //num从1开始,每找到一个相连的,则记录+1 问题:后续怎么知道这个点是岛屿几的?再写一个数组记录?
root[x][y] = num; //记录这个点是岛屿几,方便后续查找
//cout << "----" << num << "----" << countArea[num] << endl;
}
//dfs
dfssea(x + 1, y); //下
dfssea(x - 1, y); //上
dfssea(x, y + 1); //右
dfssea(x, y - 1); //左
}
//统计该海洋周围的岛屿数量
void dfsland(int x, int y, int step)
{
//越界
if (x < 0 || y < 0 || x >= N || y >= N)
{
return;
}
//只用访问一次周围,多的全不要
if (step > 1)
{
return;
}
//岛屿
if ((grid[x][y] == 2) && (step == 1))
{
//第一次访问,记录已经访问的岛屿位置
if (visit[0] == 0)
{
visit[0] = root[x][y];
area += countArea[visit[0]];
//cout << "area0: " << area << endl;
}
else
{
//已访问一次,且与第一次访问的是同一岛屿
if (visit[0] == root[x][y])
{
return;
}
else
{
//第二次访问,且与第一次访问的是不同岛屿,第一次记录
if (visit[1] == 0)
{
visit[1] = root[x][y];
area += countArea[visit[1]];
//cout << "area1: " << area << endl;
}
else
{
//第三次访问,且与前两次访问的不是同一岛屿
if (visit[1] == root[x][y])
{
return;
}
else
{
if (visit[2] == 0)
{
visit[2] = root[x][y];
area += countArea[visit[2]];
//cout << "area2: " << area << endl;
}
else
{
if (visit[2] == root[x][y])
{
return;
}
else
{
if (visit[3] == 0)
{
visit[3] = root[x][y];
area += countArea[visit[3]];
//cout << "area3: " << area << endl;
}
else
{
return;
}
}
}
}
}
}
}
}
//海洋
if (grid[x][y] == 0)
{
step++;
if (step == 1)
{
dfsland(x - 1, y, step);
dfsland(x + 1, y, step);
dfsland(x, y - 1, step);
dfsland(x, y + 1, step);
if (maxArea < area)
{
maxArea = area + 1;
}
}
}
}
int main()
{
int T;
cout << "please input the number of map" << endl;
cin >> T;
for (int i = 0; i < T; i++)
{
//cout << "num is :" << num << endl;
cout << "please input the edge of the map" << endl;
cin >> N;
cout << "please input the grid" << endl;
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
//cout << "input grid[" << j << "][" << k << "]" << endl;
cin >> grid[j][k];
}
}
//找到所有的岛屿大小
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (grid[i][j] == 1)
{
num++;
dfssea(i, j);
}
}
}
//遍历所有可能填海的可能性,并且计算填海后的大小
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (grid[i][j] == 0)
{
//cout << "now visit grid[" << i << "][" << j << "]" << endl;
dfsland(i, j, 0);
area = 0;
for (int i = 0; i < 4; i++)
visit[i] = 0;
}
}
}
cout << "after : max land area is: " << maxArea << endl;
//清0
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
grid[i][j] = 0;
root[i][j] = 0;
}
for (int i = 0; i <= num; i++)
countArea[i] = 0;
num = 0;
area = 0;
maxArea = 0;
for (int i = 0; i < 4; i++)
visit[i] = 0;
}
}
//1 0
//0 1
//
//1 1
//1 0
//
//1 1
//1 1
/*
2
5
0 1 0 1 1
1 1 1 0 0
1 1 0 0 1
0 1 0 1 1
1 1 0 0 1
8
1 0 0 0 0 1 1 1
1 1 0 1 1 0 0 1
0 1 0 1 0 0 0 1
0 1 1 1 0 0 0 0
0 0 0 0 1 1 0 0
1 0 0 1 1 0 0 0
1 0 0 0 1 1 0 0
1 1 0 1 0 1 0 1
*/
测试用例
测试用例见代码末尾注释
运行效果