给定三个整数R,C,N和大小为N的数组arr [] 。任务是为R行和C列的网格中的所有单元着色,以使所有相同的颜色单元水平或垂直连接。 N表示从1到N的颜色,arr []表示每种颜色的数量。颜色的总数恰好等于网格的像元总数。
方法:
Input: R = 3, C = 5, N = 5, arr[] = {1, 2, 3, 4, 5}
Output:
1 4 4 4 3
2 5 4 5 3
2 5 5 5 3
Explanation: Available colors are 1(count = 1), 2(count = 2), 3(count = 3) etc.
For color 5: we can reach all color 5s by going horizontally or vertically through the same color 5.
Similarly for color 3, the rightmost row contains all 3 etc.
Similarly, for the rest of the colors 1, 2, 4.
Below is an invalid grid:
1 4 3 4 4
2 5 4 5 3
2 5 5 5 3
This is because the connection for the colors 3 and 4 has been broken by the invalid position of 3
in the position(0, 2).We can no longer traverse through all the 4s or all the 3s, horizontally or vertically, by passing through the respective 3s and 4s only.
Input: R = 2, C = 2, N = 3, arr[] = {2, 1, 1}
Output:
1 1
2 3
方法:
乍一看,似乎需要图形算法。但是,我们将遵循优化的贪婪算法。
- 创建一个新的2D数组,这将是我们的最终网格。让我们将其称为dp [] []。
- 遍历颜色数组A []
- 对于具有A [i]数量的每种颜色
- 如果该行是奇数行,请从左到右填充dp数组
- 否则,如果是偶数行,则从右向左填充
- 如果某种颜色的电量用完了,请贪婪地移至下一个颜色
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 =列