📌  相关文章
📜  构造一个矩阵,其元素不超过X,且两个相邻元素的和不超过Y

📅  最后修改于: 2021-04-23 06:38:13             🧑  作者: Mango

给定四个整数NMXY ,任务是构造一个N * M矩阵,使每个像元由[0,X]范围内的值组成,以便任何两个相邻像元的总和应小于或等于等于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)