不使用图数据结构的解法
#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;
}