给定三个整数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
方法:
乍一看,似乎需要图算法。但是,我们将遵循优化的贪婪算法。
- 创建一个新的二维数组,这将是我们的最终网格。我们称之为dp[][]。
- 遍历颜色数组 A[]
- 对于每种颜色,我有 A[i] 个数量
- 如果该行是奇数行,则从左到右填充dp数组
- 否则如果是偶数行,则从右向左填充
- 如果颜色数量用完,贪婪地移动到下一个颜色
下面是上述方法的实现:
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
Javascript
输出:
1 2 2 3 3
4 4 4 4 3
5 5 5 5 5