力扣——2658. 网格图中鱼的最大数目

177 阅读1分钟

力扣——2658. 网格图中鱼的最大数目

2658. 网格图中鱼的最大数目

给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid ,其中下标在 (r, c) 处的整数表示:

  • 如果 grid[r][c] = 0 ,那么它是一块 陆地
  • 如果 grid[r][c] > 0 ,那么它是一块 水域 ,且包含 grid[r][c] 条鱼。

一位渔夫可以从任意 水域 格子 (r, c) 出发,然后执行以下操作任意次:

  • 捕捞格子 (r, c) 处所有的鱼,或者
  • 移动到相邻的 水域 格子。

请你返回渔夫最优策略下, 最多 可以捕捞多少条鱼。如果没有水域格子,请你返回 0

格子 (r, c) 相邻 的格子为 (r, c + 1)(r, c - 1)(r + 1, c)(r - 1, c) ,前提是相邻格子在网格图内。

示例 1:

img

输入:grid = [[0,2,1,0],[4,0,0,3],[1,0,0,4],[0,3,2,0]]
输出:7
解释:渔夫可以从格子 (1,3) 出发,捕捞 3 条鱼,然后移动到格子 (2,3) ,捕捞 4 条鱼。

示例 2:

img

输入:grid = [[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]]
输出:1
解释:渔夫可以从格子 (0,0) 或者 (3,3) ,捕捞 1 条鱼。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • 0 <= grid[i][j] <= 10

问题解析

因为陆地(0)把各个区域给划分开了,而且渔夫不能上岸,相当于想要获得最多的鱼,就是让渔夫进鱼最多的那个池塘就行。

这个我们可以通过dfs或bfs做到。

遍历数组,如果不为0,则我们以他为起点进行dfs或bfs,把路过的点都变为0且把值加起来,这样可以获得一个鱼塘所有数量。

在这些数量里找最多的就行。

AC代码

class Solution {
public:
    int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
    int n,m;
    int dfs(int x,int y,vector<vector<int>>& grid)
    {
        if(x<0||x>=n||y<0||y>=m||grid[x][y]==0)return 0;
        int ans=grid[x][y];
        grid[x][y]=0;
        ans+=dfs(x+1,y,grid);
        ans+=dfs(x,y+1,grid);
        ans+=dfs(x,y-1,grid);
        ans+=dfs(x-1,y,grid);
        return  ans;
    }
    int findMaxFish(vector<vector<int>>& grid) {
        if(grid.size()==0)return 0;
        n=grid.size(),m=grid[0].size();
        int mx=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                mx=max(mx,dfs(i,j,grid));
            }
        }
        return mx;
    }
};