【问题标题】:Want to get solution for the following problem of Picture Fill algo想得到以下图片填充算法问题的解决方案
【发布时间】:2021-01-14 13:27:04
【问题描述】:

问题陈述:编写一个算法来找到填充完整图片/桶所需的最大笔画数。 约束:

  1. 一个笔画可以填充相邻的单元格(左、右、上、下),但不能沿对角线填充。
  2. 给出的是字符串列表,函数应返回最大笔划数的 int 值以填充完整的图片/存储桶。

static int fillBucket(List<String> picture){}

 Sample Input: 
    1. picture = ["aaaba", "ababa",a"aaaca"],  Output: 5
    2. picture = ["bbba", "abba", "acaa", "aaac"], Output: 4

桶应如何填充的示例:

【问题讨论】:

  • 到目前为止你尝试了什么?请编辑问题并添加您的代码。
  • 当您说“最大笔画数”时,您的意思是“最小笔画数”吗?

标签: java algorithm graph-algorithm


【解决方案1】:

你可以用一个简单的洪水填充算法来解决这个问题:

public int fill(List<String> picture) {
    // convert to char array to be sure to have O(n*m) complexity
    // if the list is a linked list the complexity would be worse
    char[][] arr = new char[picture.size()][];
    int index = 0;
    for (String s : picture)
        arr[index++] = s.toCharArray();
    int count = 0;
    for (int i = 0; i < arr.length; i++)
        for (int j = 0; j < arr[i].length; j++)
            if (arr[i][j] != '-') { // '-' indicates visited
                fill(arr, arr[i][j], i, j);
                count++;
            }
    return count;
}

private void fill(char[][] arr, char c, int i, int j) {
    if (arr[i][j] != c)
        return;
    arr[i][j] = '-';
    if (i - 1 >= 0)
        fill(arr, c, i - 1, j);
    if (j - 1 >= 0)
        fill(arr, c, i, j - 1);
    if (i + 1 < arr.length)
        fill(arr, c, i + 1, j);
    if (j + 1 < arr[i].length)
        fill(arr, c, i, j + 1);
}

【讨论】:

    【解决方案2】:

    我认为以前的洪水填充算法有些不完整。由于核心逻辑保持不变,您也可以在 Java 中使用它。通过在所有迭代中检查访问过的数组来试试这个:

    #include <bits/stdc++.h>
    using namespace std;
    
    int vis[106][106] = {0};
    int h;
    void dfs(vector<string> grid, char c, int i , int j){
      if(grid[i][j] != c)
        return;
    
      vis[i][j] = 1;
    
      if(i+1 <h && vis[i+1][j] != 1){
       dfs(grid,c, i+1 , j);
      }
      if(i-1>=0 && vis[i-1][j] != 1){
       dfs(grid,c, i-1 , j);
      }
      if(j+1>=0 && vis[i][j+1] != 1){
        dfs(grid,c, i , j+1);
      }
      if(j-1 >=0 && vis[i][j-1] != 1 ){
       dfs(grid,c, i , j-1);
      }
    }
    
    int main()
    {
      int cnt = 0;  cin>>h;
      vector<string> grid(h);
    
      for(int i = 0 ; i < h ; i++){
        cin>>grid[i];
      }
    
      for(int i = 0 ; i < h ; i++)
          for(int j = 0 ; j < grid[i].length() ; j++){
              if(vis[i][j] != 1){
                dfs(grid, grid[i][j], i , j);
                cnt++;
              }
          }
    
      cout << cnt << endl;
      return 0;
    }
    

    【讨论】:

    • 该问题要求使用 Java 而非 C++ 解决方案。此外,您应该为您的答案添加一些解释,而不是简单地转储代码(即,这个答案如何解决 OP 的问题?您使用什么算法?等等)
    • 问题不一定指定Java。同样根据前面的解决方案,它是一个简单的洪水填充算法。它在第一个答案中被错误地实施,所以我提供了一个正确的答案。我可以添加 cmets 和解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2020-09-04
    • 1970-01-01
    • 2021-02-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多