827. 最大人工岛/C++(深度优先遍历)

在这里插入图片描述
深度优先遍历2次
第一次将各个岛分类,同一个岛上的格子使用同一种编号,并且得到每个岛屿的大小;
第二次试着将所有海洋都填一遍,找出最大的结果。

class Solution {
	vector<vector<int>> dir{{0,1},{0,-1},{1,0},{-1,0}};
public:
	int largestIsland(vector<vector<int>>& grid) {
		unordered_map<int,int> map;
		int m = grid.size(), n = grid[0].size();
		int num = 2, sumArea = 0;//num是编号,从2开始

		for(int i=0;i<m;++i){
			for(int j=0;j<n;++j){
				if(grid[i][j]==1){
					map[num] = dfs(grid,m,n,i,j,num);
					sumArea += map[num++];
				}
			}
		}

		if(sumArea == 0){//没有陆地
			return 1;
		}else if(sumArea == m*n){//全是陆地
			return sumArea;
		}

		int maxRes = 0;
		for(int i=0;i<m;++i){
			for(int j=0;j<n;++j){
				if(grid[i][j]==0){
                    int temp = 0;
                    unordered_set<int> visited;
                    for(auto d:dir){
                        int x1 = i+d[0], y1 = j+d[1];
                        if(x1>=0 && y1>=0 && x1<m && y1<n && visited.count(grid[x1][y1])==0){
                            temp += map[grid[x1][y1]];
                            visited.insert(grid[x1][y1]);
                        }
                    }
					maxRes = max(maxRes,temp+1);//+1是填的陆地
				}
			}
		}
		return maxRes;
	}
	
	int dfs(vector<vector<int>>& grid, int m,int n,int x, int y, int num){
		int area = 1;
		grid[x][y] = num;
		for(auto d:dir){
			int x1 = x+d[0], y1 = y+d[1];
			if(x1>=0 && y1>=0 && x1<m && y1<n && grid[x1][y1]==1)
				area += dfs(grid,m,n,x1,y1,num);
		}
		return area;
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值