【问题标题】:Given a periphery of island mark its interior in matrix (Algorithm)给定岛的外围标记其在矩阵中的内部(算法)
【发布时间】:2020-09-15 19:15:21
【问题描述】:

我们得到一个大小为 N 的矩阵,它完全用 0 填充,我们还得到一个坐标列表,其中包含一个岛屿外围的坐标。现在我们必须将岛屿(外围 + 属于岛屿一部分的区域)标记为 1。

我在想出解决这个问题的方法时遇到了麻烦,我想到了 bfs/dfs,但想不出一种方法来实现它。 (请假设只有 1 个岛并且输入正确,即所有输入坐标形成闭合形状并且有效

N = 5
coordinates = 
0,2
1,1
1,3
2,0
2,4
3,1
3,3
4,2

所以这就是输出的样子---

    0 1 2 3 4
  0 0 0 1 0 0
  1 0 1 1 1 0 
  2 1 1 1 1 1 
  3 0 1 1 1 0 
  4 0 0 1 0 0 

所有标出的坐标和其中标出的方框是岛屿的一部分。

【问题讨论】:

    标签: c++ algorithm c++11 matrix graph-algorithm


    【解决方案1】:

    如果您知道岛内的某个点,则可以从该点开始使用基于 DFS 或 BFS 的洪水填充来解决此问题。

    不过,要可靠地找到这样一个点有点棘手,所以我建议一种更简单的方法:不要使用泛滥填充来查找岛内的点,而是从沿线的所有 0 点开始泛滥填充矩阵边界以查找岛内的点。然后将您没有找到的所有点设置为 1。

    【讨论】:

      【解决方案2】:

      似乎外围坐标只是填充水平线的末端。

      在这种情况下,使用 for 循环将行内的元素设置为 1。伪代码:

      lastrow = -1
      lastcol = -1  
      for every line:
         extract row, col
         if row = lastrow:
             for (i=lastcol + 1; i<=col; i++):   //fill line
                A[row][i] = 1
             lastrow = -1    // to treat possible space in the line
         else:
             A[row][col] = 1     //set the only cell
         lastrow = row
         lastcol = col   
      

      【讨论】:

      • 在我看来,这个问题对于输入数据的外观有点不清楚。可能需要对每一行执行这种操作,然后是每一列,甚至可能是每一行......
      • @Damien 也许你是对的,但我不认为此时呈现数据的必要性
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 2012-06-07
      • 2021-04-24
      • 1970-01-01
      相关资源
      最近更新 更多