📌  相关文章
📜  对网格进行着色,以使所有相同颜色的像元水平或垂直连接

📅  最后修改于: 2021-04-29 09:38:22             🧑  作者: Mango

给定三个整数R,C,N和大小为N的数组arr [] 。任务是为R行和C列的网格中的所有单元着色,以使所有相同的颜色单元水平或垂直连接。 N表示从1到N的颜色,arr []表示每种颜色的数量。颜色的总数恰好等于网格的像元总数。

方法:

方法:

乍一看,似乎需要图形算法。但是,我们将遵循优化的贪婪算法。

  1. 创建一个新的2D数组,这将是我们的最终网格。让我们将其称为dp [] []。
  2. 遍历颜色数组A []
  3. 对于具有A [i]数量的每种颜色
    • 如果该行是奇数行,请从左到右填充dp数组
    • 否则,如果是偶数行,则从右向左填充
  4. 如果某种颜色的电量用完了,请贪婪地移至下一个颜色
    Arrow directions for filling the dp array:
    ------->
    <-------
    -------->
    <--------

    示例: R = 3,C = 5,N = 5,A = [1、2、3、4、5]

    1 2 2 3 3 
    [row 0 -> fill from left to right]
    4 4 4 4 3 
    [row 1 -> fill from right to left]
    5 5 5 5 5 [row 2 -> fill from left to right]

    下面是上述方法的实现:

    C++
    // C++ Program to Color a grid
    // such that all same color cells
    // are connected either
    // horizontally or vertically
      
    #include 
    using namespace std;
      
    void solve(vector& arr,
               int r, int c)
    {
        // Current color
        int idx = 1;
      
        // final grid
        int dp[r];
      
        for (int i = 0; i < r; i++) {
      
            // if even row
            if (i % 2 == 0) {
      
                // traverse from left to
                // right
                for (int j = 0; j < c; j++) {
      
                    // if color has been exhausted
                    //, move to the next color
                    if (arr[idx - 1] == 0)
                        idx++;
      
                    // color the grid at
                    // this position
                    dp[i][j] = idx;
      
                    // reduce the color count
                    arr[idx - 1]--;
                }
            }
            else {
      
                // traverse from right to
                // left for odd rows
                for (int j = c - 1; j >= 0; j--) {
                    if (arr[idx - 1] == 0)
                        idx++;
                    dp[i][j] = idx;
                    arr[idx - 1]--;
                }
            }
        }
      
        // print the grid
        for (int i = 0; i < r; ++i) {
            for (int j = 0; j < c; ++j) {
                cout << dp[i][j] << " ";
            }
            cout << endl;
        }
    }
      
    // Driver code
    int main()
    {
        int r = 3, c = 5;
        int n = 5;
        vector arr
            = { 1, 2, 3, 4, 5 };
        solve(arr, r, c);
        return 0;
    }


    Java
    // Java program to color a grid           
    // such that all same color cells           
    // are connected either           
    // horizontally or vertically           
    import java.util.*;    
      
    class GFG{          
                 
    static void solve(List arr,
                      int r, int c)           
    { 
          
        // Current color           
        int idx = 1;           
                 
        // Final grid           
        int[][] dp = new int[r];           
                 
        for(int i = 0; i < r; i++)
        {           
              
            // If even row           
            if (i % 2 == 0)
            {
                  
                // Traverse from left to           
                // right           
                for(int j = 0; j < c; j++)
                {
                      
                    // If color has been exhausted 
                    //, move to the next color 
                    if (arr.get(idx - 1) == 0)      
                        idx++; 
                      
                    // Color the grid at 
                    // this position
                    dp[i][j] = idx; 
                      
                    // Reduce the color count 
                    arr.set(idx - 1,
                    arr.get(idx - 1) - 1); 
                }
            }
            else
            {
                  
                // Traverse from right to 
                // left for odd rows 
                for(int j = c - 1; j >= 0; j--)
                {
                    if (arr.get(idx - 1) == 0)      
                        idx++; 
                  
                    dp[i][j] = idx; 
                  
                    arr.set(idx - 1, 
                    arr.get(idx - 1) - 1); 
                }          
            }           
        }           
                 
        // Print the grid           
        for(int i = 0; i < r; ++i) 
        {           
            for(int j = 0; j < c; ++j)
            {           
                System.out.print(dp[i][j] + " ");           
            }           
            System.out.println();           
        }           
    }          
             
    // Driver Code          
    public static void main (String[] args)
    {          
        int r = 3, c = 5;           
        int n = 5;           
        List arr = Arrays.asList(1, 2, 3, 4, 5); 
          
        solve(arr, r, c);           
    }          
    }
      
    // This code is contributed by offbeat


    Python3
    # Python3 program to color a grid
    # such that all same color cells
    # are connected either
    # horizontally or vertically
    def solve(arr, r, c):
          
        # Current color
        idx = 1
      
        # Final grid
        dp = [[0 for i in range(c)]
                 for i in range(r)]
      
        for i in range(r):
      
            # If even row
            if (i % 2 == 0):
      
                # Traverse from left to
                # right
                for j in range(c):
      
                    # If color has been exhausted,
                    # move to the next color
                    if (arr[idx - 1] == 0):
                        idx += 1
      
                    # Color the grid at
                    # this position
                    # print(i,j)
                    dp[i][j] = idx
      
                    # Reduce the color count
                    arr[idx - 1] -= 1
            else:
      
                # Traverse from right to
                # left for odd rows
                for j in range(c - 1, -1, -1):
                    if (arr[idx - 1] == 0):
                        idx += 1
                          
                    dp[i][j] = idx
                    arr[idx - 1] -= 1
      
        # Print the grid
        for i in range(r):
            for j in range(c):
                print(dp[i][j], end = " ")
      
            print()
      
    # Driver code
    if __name__ == '__main__':
      
        r = 3
        c = 5
        n = 5
        arr = [ 1, 2, 3, 4, 5 ]
          
        solve(arr, r, c)
      
    # This code is contributed by mohit kumar 29


    C#
    // C# program to color a grid         
    // such that all same color cells         
    // are connected either         
    // horizontally or vertically         
    using System; 
    using System.Collections.Generic; 
      
    class GFG{         
                  
    static void solve(List arr,
                    int r, int c)         
    { 
          
        // Current color         
        int idx = 1;         
                  
        // Final grid         
        int[,] dp = new int[r, c];         
                  
        for(int i = 0; i < r; i++)
        {         
              
            // If even row         
            if (i % 2 == 0)
            {
                  
                // Traverse from left to         
                // right         
                for(int j = 0; j < c; j++)
                {
                      
                    // If color has been exhausted, 
                    // move to the next color 
                    if (arr[idx - 1] == 0)     
                        idx++; 
                      
                    // Color the grid at 
                    // this position
                    dp[i, j] = idx; 
                      
                    // Reduce the color count 
                    arr[idx - 1] = arr[idx - 1] - 1; 
                }
            }
            else
            {
                  
                // Traverse from right to 
                // left for odd rows 
                for(int j = c - 1; j >= 0; j--)
                {
                    if (arr[idx - 1] == 0)     
                        idx++; 
                  
                    dp[i, j] = idx; 
                    arr[idx - 1] = arr[idx - 1] - 1; 
                }         
            }         
        }         
                  
        // Print the grid         
        for(int i = 0; i < r; ++i) 
        {         
            for(int j = 0; j < c; ++j)
            {         
                Console.Write(dp[i, j] + " ");         
            }         
            Console.Write('\n');         
        }         
    }         
              
    // Driver Code         
    public static void Main (string[] args)
    {         
        int r = 3, c = 5;         
        //int n = 5;    
          
        List arr = new List();
        arr.Add(1); 
        arr.Add(2);
        arr.Add(3);
        arr.Add(4);
        arr.Add(5);
          
        solve(arr, r, c);         
    }         
    }
      
    // This code is contributed by rutvik_56


    输出:
    1 2 2 3 3 
    4 4 4 4 3 
    5 5 5 5 5
    

    时间复杂度: O(R * C),其中R =行,C =列
    辅助空间: O(R * C),其中R =行,C =列