DFS求岛屿最大面积
Posted 上衫_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DFS求岛屿最大面积相关的知识,希望对你有一定的参考价值。
求岛屿最大面积
题目
给定一个包含了一些0和1的非空二维数组,一个岛屿是由一些相邻的1(代表土地)构成的组合,这里的「相邻」要求两个1必须在水平或者竖直方向上相邻。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
数据范围:长宽都不超过50。
源代码
#include<iostream>
using namespace std;
int a, b;
int data1[50][50];
bool visited[50][50] = false;
int Dfs(int m, int n)
int s = 0;
if(data1[m][n] && !visited[m][n])
s++;
else
return 0;
visited[m][n] = true;
if( m - 1 >= 0)
s += Dfs(m - 1, n);
if(m + 1 < a)
s += Dfs(m + 1, n);
if( n - 1 >= 0)
s += Dfs(m, n - 1);
if( n + 1 < b)
s += Dfs(m, n + 1);
return s;
int max_s()
int num[50] = 0;
int k = 0;
for (int i = 0; i < a; i++)
for (int j = 0; j < b; j++)
if (data1[i][j] && !visited[i][j])
num[k] = Dfs(i, j);
k++;
int max = num[0];
for (int i = 1; i < k; i++)
if(num[i] > max)
max = num[i];
return max;
int main()
cout << "请输入矩阵的行:";
cin >> a;
cout << "请输入矩阵的列:";
cin >> b;
cout << "输入矩阵中的数据:";
for (int i = 0; i < a; i++)
for (int j = 0; j < b; j++)
cin >> data1[i][j];
cout << max_s() << endl;
return 0;
结果
测试数据
1 0 0 1 0 1 1 0 1 0
0 0 1 1 1 0 1 0 0 1
0 1 1 0 1 0 1 1 1 1
0 0 1 0 0 1 1 1 0 0
1 0 1 1 0 0 0 0 0 0
0 0 0 0 1 0 1 1 1 1
解释
这里我采用了类似于求图边数的思想。
首先设一bool型visited数组,用来判断该点是否被访问过(初始值全为false)。
由于一组数据中可能会出现多个岛屿,设一int型num数组,用于存放所求得的岛屿面积,然后再找出其中的最大值。
在函数max_s()中遍历每个点,如果这个点值为1且没有被访问过,就对这个点进行深度优先搜索。
在函数Dfs(int m, int n)中如果这个点值为1且没有被访问过就将该岛屿面积s加一,如果不符合条件直接返回0;每访问一个点后都将其对应的visited数组中位置设为true,然后搜索该点上下左右的四个点(如果在范围之内的话),所有的搜索完成后返回s。
以上是关于DFS求岛屿最大面积的主要内容,如果未能解决你的问题,请参考以下文章