• 岛屿的最大面积leetcode


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 mmjbxhqj 2024-06-15 17:10 采纳率: 0% 浏览 2 首页/ 学习和成长 / 岛屿的最大面积leetcode leetcode蓝桥杯 有个n×m的花园,'#'是土地,'.'是溪水,【种花面积】是由一些相邻的’#‘组合构成,这里的「相邻」要求两个’#‘必须在水平或者竖直的四个方向上相邻。我们把上下左右四个方向相邻的’#'连通区域作为一块种花面积,现在需要统计最大的一块面积是多少?如果不存在连通块,输出-1。要求:使用广搜。暴力破解 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-15 17:14
      关注

      引自免费微信小程序:皆我百晓生

      要解决这个问题,我们可以使用广度优先搜索(BFS)算法来遍历整个花园地图,寻找最大种花面积。下面是一个详细的步骤分解以及相应的Python代码实现。

      步骤分解:

      1. 初始化:创建一个二维数组garden来表示花园的状态。同时,定义一个队列queue用于存储待探索的点,以及一个变量max_area来记录最大的种花面积。
      2. 遍历花园:从左到右、从上到下遍历花园的每一个位置。对于每个位置,检查是否为土地('#'),如果是,则从这个位置开始进行广度优先搜索。
      3. 广度优先搜索:将当前位置加入队列,并将其标记为已访问(可以将它变为另一个字符,比如'X')。然后开始循环处理队列中的元素,每次从队列中取出一个元素,检查其四周的邻居是否也是土地,如果是,将它们也加入队列并标记为已访问。同时,计算当前连通块的面积。
      4. 更新最大面积:每完成一个连通块的搜索,就用当前连通块的面积更新max_area
      5. 返回结果:遍历结束后,max_area即为所求的最大种花面积。如果max_area仍然为初始值(例如0),则说明没有找到任何连通的土地,应返回-1。

      Python代码实现:

      from collections import deque
      
      def max_flower_area(garden):
          if not garden or not garden[0]:
              return -1
          
          rows, cols = len(garden), len(garden[0])
          max_area = 0
          directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 右下左上
      
          def bfs(r, c):
              area = 1
              queue = deque([(r, c)])
              garden[r][c] = 'X'  # 标记为已访问
              
              while queue:
                  x, y = queue.popleft()
                  for dx, dy in directions:
                      nx, ny = x + dx, y + dy
                      if 0 <= nx < rows and 0 <= ny < cols and garden[nx][ny] == '#':
                          garden[nx][ny] = 'X'
                          queue.append((nx, ny))
                          area += 1
              return area
      
          for r in range(rows):
              for c in range(cols):
                  if garden[r][c] == '#':
                      max_area = max(max_area, bfs(r, c))
      
          return max_area if max_area > 0 else -1
      
      # 示例输入
      garden = [
          ['#', '.', '#', '#', '.'],
          ['#', '.', '.', '.', '#'],
          ['#', '#', '#', '.', '.'],
          ['.', '.', '.', '.', '.']
      ]
      
      print(max_flower_area(garden))  # 输出应为9,因为最大的连通土地面积为9
      

      这段代码首先导入了deque类,这是为了高效地实现队列操作。然后定义了max_flower_area函数,该函数接受一个二维数组garden作为参数。通过遍历和广度优先搜索,最终返回花园中最大的种花面积。如果花园中没有任何土地,函数将返回-1。

      展开全部

      评论 编辑记录
    • 阿里嘎多学长 2024-06-15 17:14
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      您需要解决的问题是一个典型的图搜索问题,可以通过广度优先搜索(BFS)算法来解决。在这个问题中,我们需要遍历整个矩阵,对于每个遇到的'#',使用BFS来确定其连通区域的大小,并记录下最大的连通区域的面积。如果遍历结束后没有找到任何连通的'#'区域,则输出-1。

      以下是使用C++实现的BFS算法的示例代码:

      #include 
      #include 
      using namespace std;
      
      int maxAreaOfIsland(vector>& grid) {
          int max_area = 0;
          int rows = grid.size();
          int cols = grid[0].size();
          vector> visited(rows, vector(cols, false));
      
          for (int i = 0; i < rows; ++i) {
              for (int j = 0; j < cols; ++j) {
                  if (grid[i][j] == '#' && !visited[i][j]) {
                      queue> q;
                      q.push({i, j});
                      visited[i][j] = true;
                      int area = 0;
      
                      while (!q.empty()) {
                          auto [x, y] = q.front();
                          q.pop();
                          area++;
      
                          // Check all four directions
                          vector> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
                          for (auto& dir : directions) {
                              int new_x = x + dir.first;
                              int new_y = y + dir.second;
      
                              if (new_x >= 0 && new_x < rows && new_y >= 0 && new_y < cols &&
                                  grid[new_x][new_y] == '#' && !visited[new_x][new_y]) {
                                  q.push({new_x, new_y});
                                  visited[new_x][new_y] = true;
                              }
                          }
                      }
      
                      max_area = max(max_area, area);
                  }
              }
          }
      
          return max_area > 0 ? max_area : -1;
      }
      

      这段代码首先定义了一个maxAreaOfIsland函数,它接受一个二维字符数组grid作为输入。然后,它使用两个嵌套循环遍历整个矩阵,寻找所有的'#'字符。对于每个找到的'#',它使用一个队列来执行BFS,同时使用一个visited数组来跟踪已经访问过的区域。BFS过程中,每找到一个连通的'#',就将其标记为已访问,并累加到当前区域的面积中。最后,函数返回记录的最大面积,如果没有找到任何连通区域,则返回-1。

      关于参考资料,以下是一些相关的网页链接:

      1. LeetCode 695. 岛屿的最大面积[^7^]
      2. LeetCode-算法-岛屿的最大面积 - CSDN博客[^8^]
      3. LeetCode 695. 岛屿的最大面积【c++/java详细题解】 - CSDN博客[^10^]

      请注意,这些链接可能包含不同的解决方案和讨论,您可以根据自己的需要进行参考。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 2024-06-15 17:16
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      这个问题可以通过迭代的方式来解决。首先将所有可能的连接方式(包括重复)排序,然后每次从已排序的解中选择最大的一个。由于我们是在二维数组中寻找最大面积,所以我们还需要考虑边界条件。

      以下是修改后的Python代码:

      def maxArea(grid):
          n, m = len(grid), len(grid[0])
          directions = [(0, -1), (1, 0), (-1, 1), (0, -1)]
          
          def dfs(row, col, direction):
              if row < 0 or row >= n or col < 0 or col >= m:
                  return False
              if grid[row][col] != '#':
                  return True
              for dr, dc in directions:
                  nx, ny = row + dr, col + dc
                  if 0 <= nx < n and 0 <= ny < m and grid[nx][ny] == '#' and dfs(nx, ny, direction):
                      return True
              return False
          
          result = -1
          for row in range(n):
              for col in range(m):
                  if not dfs(row, col, directions[(row//2)%4]):
                      result = max(result, grid[row][col])
                      
          return result
      
      grid = [[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]]
      print(maxArea(grid))
      

      在这个代码中,dfs函数用于深度优先搜索,它会尝试找到一条从当前点到给定的下一行或上一行的路径,并检查这条路径是否可以连续地包含所有的#和其它的`.'。如果没有这样的路径,则返回False,表示这个位置不能填满任何东西。

      接下来,我们初始化结果变量为-1,然后遍历所有可能的行和列的组合。对于每一对可能的组合,我们调用dfs函数来检查是否可以从当前位置开始填满整个花园。如果找到了满足条件的组合,我们就更新结果变量。

      最后,我们返回结果变量,即最大的一块填满花园的面积。

      注意:这个算法的时间复杂度是O(2^n),其中n是花园的行数或列数。因此,如果你有大量的花园数据,你可能会发现这并不是最优的方法。

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    http 302状态码
    HarmonyOS 监听软键盘key
    亚马逊API接口解析,实现获得AMAZON商品详情
    2023.11.13 信息学日志
    猿创征文| Redis的发布订阅
    AMD GPU 内核驱动架构分析(一)
    【一起学Rust | 框架篇 | ws-rs框架】属于Rust的Websocket框架——ws-rs
    2024最新版Python安装详细教程!一键安装,永久使用
    HTB-GoodGame
    腾讯程序员的手码K8S+Jenkins笔记
  • 原文地址:https://ask.csdn.net/questions/8119019