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求岛屿最大面积的主要内容,如果未能解决你的问题,请参考以下文章

前端算法-岛屿的最大面积 DFS(深度优先搜索) 质数计数

695. 岛屿的最大面积(dfs)

695-岛屿的最大面积

DFS 算法秒杀岛屿系列题目

UVa 11094 - Continents

岛屿类问题的通用解法DFS 遍历框架