/*
题目描述:
给定一个二维的0-1矩阵,其中0表示海洋、1表示陆地.单独地或者相邻的陆地可以形成
岛屿,每个格子只与其上下左右四个格子相邻.求最大的岛屿面积.
示例 1:
Input:[[1,0,1,1,0,1,0,1],
[1,0,1,1,0,1,1,1],
[0,0,0,0,0,0,0,1]]
Output:6
最大的岛屿面积是6,位于最右侧;
解题思路:
此题是一道典型的搜索题,可以采用深度优先搜索(DFS).一般来说,深度优先搜索类型,本文
选用栈(stack)实现,一是便于理解,二是更不易出现递归栈满的情况.对于四个方向的遍历,
可以创造数组[-1,0,1,0,-1],每相邻两位即代表上下左右四个方向。
*/
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
class Solution{
public:
Solution(vector<vector<int>>& _nums):nums(_nums){}
int maxAreaOfIsland(){
int row=nums.size(),low=row?nums[0].size():0;
int local_area,area=0,x,y,m,n;
stack<pair<int,int>> island;
for(int i=0;i<row;i++){
for(int j=0;j<low;j++){
/*判断该点是否为岛屿*/
if(nums[i][j]){
local_area=1;
nums[i][j]=0;/*设置为海洋,表示已经访问过*/
island.push({i,j});
while(!island.empty()){
m=island.top().first,n=island.top().second;
island.pop();
/*访问上下左右的点*/
for(int k=0;k<4;k++){
x=m+direction[k],y=n+direction[k+1];
if(x>=0&&x<row&&y>=0&&y<low&&nums[x][y]==1){
nums[x][y]=0;
++local_area;
island.push({x,y});
}
}
}
}
area=max(area,local_area);
}
}
return area;
}
private:
vector<vector<int>> nums;
vector<int> direction{-1,0,1,0,-1};
};
int main(int argc,char* argv[]){
vector<vector<int>> nums={{1,0,1,1,0,1,0,1}, {1,0,1,1,0,1,1,1}, {0,0,0,0,0,0,0,1}};
cout<<Solution(nums).maxAreaOfIsland()<<endl;
return 0;
}