给定四个整数N , M , X和Y ,任务是构造一个N * M矩阵,使每个像元由[0,X]范围内的值组成,以便任何两个相邻像元的总和应小于或等于等于Y ,矩阵的总和应为最大值。
例子:
Input: N = 3, M = 3, X = 5, Y = 3
Output:
3 0 3
0 3 0
3 0 3
Explantion:
All the values of the matrix are between 0 to 5.
The Sum of any two adjacent cells is equal to 3.
The total sum of the matrix is 15, which is maximum possible.
Input: N = 3, M = 3, X = 3, Y = 5
Output:
3 2 3
2 3 2
3 2 3
方法:
请按照以下步骤解决问题:
- 为了满足两个必要条件,矩阵仅需要交替填充以下两个数字:
First number = minimum(X, Y)
Second number = minimum(2X, Y) – First Number
Illustration:
N = 3, M = 3, X = 5, Y = 3
First Number = Minimum(X, Y) = Minimum(5, 3) = 3
Second Number = Minimum(2X, Y) – 3 = Minimum(10, 3) – 3 = 3 – 3 = 0
Therefore, sum of any two adjacent cells = 3 + 0 = 3(= Y)
- 最后,交替打印两个数字,第一个数字,然后第二个数字,以最大化矩阵的总和。
下面是上述方法的实现。
C++
// C++ implementation of
// the above approach
#include
using namespace std;
// Function to print the
// required matrix
void FindMatrix(int n, int m,
int x, int y)
{
int a, b, i, j;
// For 1*1 matrix
if (n * m == 1) {
if (x > y) {
cout << y << "\n";
}
else {
cout << x << "\n";
}
return;
}
// Greater number
a = min(x, y);
// Smaller number
b = min(2 * x, y) - a;
// Sets/Resets for alternate
// filling of the matrix
bool flag = true;
// Print the matrix
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
if (flag)
cout << a << ' ';
else
cout << b << ' ';
flag = !flag;
}
// If end of row is reached
if (((n % 2 != 0 && m % 2 == 0)
|| (n % 2 == 0 && m % 2 == 0)))
flag = !flag;
cout << "\n";
}
}
// Driver Code
int main()
{
int N, M, X, Y;
N = 3;
M = 3;
X = 5;
Y = 3;
FindMatrix(N, M, X, Y);
}
Java
// Java implementation of
// the above approach
class GFG{
// Function to print the
// required matrix
static void FindMatrix(int n, int m,
int x, int y)
{
int a, b, i, j;
// For 1*1 matrix
if (n * m == 1)
{
if (x > y)
{
System.out.print(y + "\n");
}
else
{
System.out.print(x + "\n");
}
return;
}
// Greater number
a = Math.min(x, y);
// Smaller number
b = Math.min(2 * x, y) - a;
// Sets/Resets for alternate
// filling of the matrix
boolean flag = true;
// Print the matrix
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (flag)
System.out.print(a + " ");
else
System.out.print(b + " ");
flag = !flag;
}
// If end of row is reached
if (((n % 2 != 0 && m % 2 == 0) ||
(n % 2 == 0 && m % 2 == 0)))
flag = !flag;
System.out.print("\n");
}
}
// Driver Code
public static void main(String[] args)
{
int N, M, X, Y;
N = 3;
M = 3;
X = 5;
Y = 3;
FindMatrix(N, M, X, Y);
}
}
// This code is contributed by gauravrajput1
Python3
# Python3 implementation of
# the above approach
# Function to print the
# required matrix
def FindMatrix(n, m, x, y):
# For 1*1 matrix
if (n * m == 1):
if (x > y):
print(y)
else:
print(x)
return
# Greater number
a = min(x, y)
# Smaller number
b = min(2 * x, y) - a
# Sets/Resets for alternate
# filling of the matrix
flag = True
# Print the matrix
for i in range(n):
for j in range(m):
if (flag):
print(a, end = " ")
else:
print(b, end = " ")
flag = not flag
# If end of row is reached
if (((n % 2 != 0 and m % 2 == 0) or
(n % 2 == 0 and m % 2 == 0))):
flag = not flag
print ()
# Driver Code
N = 3
M = 3
X = 5
Y = 3
FindMatrix(N, M, X, Y)
# This code is contributed by chitranayal
C#
// C# implementation of
// the above approach
using System;
class GFG{
// Function to print the
// required matrix
static void FindMatrix(int n, int m,
int x, int y)
{
int a, b, i, j;
// For 1*1 matrix
if (n * m == 1)
{
if (x > y)
{
Console.Write(y + "\n");
}
else
{
Console.Write(x + "\n");
}
return;
}
// Greater number
a = Math.Min(x, y);
// Smaller number
b = Math.Min(2 * x, y) - a;
// Sets/Resets for alternate
// filling of the matrix
bool flag = true;
// Print the matrix
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (flag)
Console.Write(a + " ");
else
Console.Write(b + " ");
flag = !flag;
}
// If end of row is reached
if (((n % 2 != 0 && m % 2 == 0) ||
(n % 2 == 0 && m % 2 == 0)))
flag = !flag;
Console.Write("\n");
}
}
// Driver Code
public static void Main(String[] args)
{
int N, M, X, Y;
N = 3;
M = 3;
X = 5;
Y = 3;
FindMatrix(N, M, X, Y);
}
}
// This code is contributed by Amit Katiyar
3 0 3
0 3 0
3 0 3
时间复杂度: O(N * M)
空间复杂度: O(1)