岛屿的最大面积及组成

不使用图数据结构的解法

#include <iostream>
#include "LinkQueue.h"
#include "DynamicList.h"

using namespace std;
using namespace LJLib;

int Solve(int Matrix[][5], int row, int col, int m, int n, DynamicList<int>* list)
{
    int area = 0;

    if(Matrix[m][n] > 0)
    {
        area += Matrix[m][n];
        Matrix[m][n] = 0;

        list->insert(m);
        list->insert(n);

        if(m - 1 >= 0)
        {
            area += Solve(Matrix, row, col, m - 1, n, list);
        }

        if(m + 1 < row)
        {
            area += Solve(Matrix, row, col, m + 1, n, list);
        }

        if(n - 1 >= 0)
        {
            area += Solve(Matrix, row, col, m, n - 1, list);
        }

        if(n + 1 < col)
        {
            area += Solve(Matrix, row, col, m, n + 1, list);
        }
    }

    return area;
}

int main()
{
    const int ROW = 4;
    const int COL = 5;

    int maxArea = 0;

    int Matrix[ROW][COL] =
    {
        {0, 1, 1, 0, 0},
        {0, 1, 0, 1, 3},
        {0, 1, 2, 0, 1},
        {0, 1, 0, 1, 1}
    };

    DynamicList<DynamicList<int>*> dl(5);

    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COL; j++)
        {
            if(Matrix[i][j] > 0)
            {
                DynamicList<int>* list = new DynamicList<int>(20);
                int area = Solve(Matrix, ROW, COL, i, j, list);

                list->insert(area);
                dl.insert(list);

                if(maxArea < area)
                {
                    maxArea = area;
                }
            }
        }
    }

    if(maxArea > 0)
    {
        cout << "Max Area = " << maxArea << endl;

        for(int i = 0; i < dl.length(); i++)
        {
            DynamicList<int>* list = dl[i];

            if((*list)[list->length() - 1] == maxArea)
            {
                for(int j = 0; j < list->length() - 1; j += 2)
                {
                    cout << "(" << (*list)[j] << ", " << (*list)[j + 1] << ")" << "  ";
                }
            }

            cout << endl;
        }
    }

    for(int i = 0; i < dl.length(); i++)
    {
        delete dl[i];
    }

    return 0;
}

使用图数据结构的解法

#include <iostream>
#include "ListGraph.h"
#include "SharedPointer.h"
#include "DynamicArray.h"

using namespace std;
using namespace LJLib;

int main()
{
    const int ROW = 4;
    const int COL = 5;

    int matrix[ROW][COL] =
    {
        {1, 1, 0, 0, 1},
        {1, 0, 0, 1, 0},
        {1, 1, 0, 1, 0},
        {0, 0, 1, 0, 0}
    };

    ListGraph<int, int> graph(ROW * COL);

    // 矩阵的每一个元素对应图的一个顶点,顶点的值为矩阵元素的值
    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COL; j++)
        {
            graph.setVertex(i * COL + j, matrix[i][j]);
        }
    }

    // 水平方向相邻两顶点的值大于0则存在边
    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COL - 1; j++)
        {
            if((graph.getVertex(i * COL + j) > 0) && (graph.getVertex(i * COL + j + 1) > 0))
            {
                graph.setEdge(i * COL + j, i * COL + j + 1, 1);
                graph.setEdge(i * COL + j + 1, i * COL + j, 1);
            }
        }
    }

    // 垂直方向相邻两顶点的值大于0则存在边
    for(int j = 0; j < COL; j++)
    {
        for(int i = 0; i < ROW - 1; i++)
        {
            if((graph.getVertex(i * COL + j) > 0) && (graph.getVertex((i + 1) * COL + j) > 0))
            {
                graph.setEdge(i * COL + j, (i + 1) * COL + j, 1);
                graph.setEdge((i + 1) * COL + j, i * COL + j, 1);
            }
        }
    }

    SharedPointer<Array<int>> ret;  // 记录海岛最大面积时的顶点编号
    int maxArea = 0;  // 记录海岛的最大面积

    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COL; j++)
        {
            // 存在海岛
            if(matrix[i][j] > 0)
            {
                // 记录海岛的顶点编号
                SharedPointer<Array<int>> sa = graph.DFS(i * COL + j);

                if(sa->length() > 0)
                {
                    int area = 0;

                    for(int k = 0; k < sa->length(); k++)
                    {
                        // 计算每个海岛的面积
                        area += graph.getVertex((*sa)[k]);

                        // 将每个海岛的矩阵元素设置为0,避免重复遍历同一个海岛
                        matrix[(*sa)[k] / COL][(*sa)[k] % COL] = 0;
                    }

                    if(area > maxArea)
                    {
                        maxArea = area;
                        ret = sa;
                    }
                }
            }
        }
    }

    cout << "maxArea = " << maxArea << endl;

    for(int i = 0; i < ret->length(); i++)
    {
        cout << "(" << (*ret)[i] / COL << ", " << (*ret)[i] % COL << ") ";
    }

    cout << endl;

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值