📜  找到使两个矩阵相等的变换数

📅  最后修改于: 2022-05-13 01:57:21.461000             🧑  作者: Mango

找到使两个矩阵相等的变换数

给定两个 n*m 阶矩阵 A 和 B。任务是找到所需的转换步骤数,以使两个矩阵相等,如果不可能,则打印 -1。
转化步骤如下:
i) 从两个矩阵中选择任意一个矩阵。
ii) 选择所选矩阵的任一行/列。
iii) 将选择行/列的每个元素加 1。
例子 :

Input : 
A[2][2]: 1 1
         1 1
B[2][2]: 1 2
         3 4
Output : 3
Explanation :
1 1   ->   1 2   ->   1 2   ->   1 2
1 1   ->   1 2   ->   2 3   ->   3 4

Input :
A[2][2]: 1 1
         1 0
B[2][2]: 1 2
         3 4
Output : -1
Explanation : No transformation will make A and B equal.

解决此问题的关键步骤是:
->增加 A[][] 的任何行与减少 B[][] 的同一行相同。因此,我们可以在仅对一个矩阵进行递增或递减变换后得到解决方案。

So make A[i][j] = A[i][j] - B[i][j].
For example,
If given matrices are,
A[2][2] : 1 1  
          1 1
B[2][2] : 1 2
          3 4
After subtraction, A[][] becomes,
A[2][2] : 0 -1
         -2 -3 

->对于每个转换,第一行/第一列元素都必须更改,其他第 i 行/列也是如此。
->如果 ( A[i][j] – A[i][0] – A[0][j] + A[0][0] != 0) 则不存在解。
->第一行第一列的元素只导致结果。

// Update matrix A[][]
// so that only A[][]
// has to be transformed
for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)
        A[i][j] -= B[i][j];

// Check necessary condition
// For condition for 
// existence of full transformation
for (i = 1; i < n; i++)
    for (j = 1; j < m; j++)
        if (A[i][j] - A[i][0] - A[0][j] + A[0][0] != 0)
            return -1;

// If transformation is possible
// calculate total transformation
result = 0;
for (i = 0; i < n; i++)
    result += abs(A[i][0])
for (j = 0; j < m; j++)
    result += abs(A[0][j] - A[0][0]);
return abs(result);

C++
// C++ program to find
// number of countOpsation
// to make two matrix equals
#include 
using namespace std;
 
const int MAX = 1000;
 
int countOps(int A[][MAX], int B[][MAX],
             int m, int n)
{
    // Update matrix A[][]
    // so that only A[][]
    // has to be countOpsed
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            A[i][j] -= B[i][j];
 
    // Check necessary condition
    // for condition for
    // existence of full countOpsation
    for (int i = 1; i < n; i++)
    for (int j = 1; j < m; j++)
        if (A[i][j] - A[i][0] -
            A[0][j] + A[0][0] != 0)
        return -1;
 
    // If countOpsation is possible
    // calculate total countOpsation
    int result = 0;
    for (int i = 0; i < n; i++)
        result += abs(A[i][0]);
    for (int j = 0; j < m; j++)
        result += abs(A[0][j] - A[0][0]);
    return (result);
}
 
// Driver code
int main()
{
    int A[MAX][MAX] = { {1, 1, 1},
                        {1, 1, 1},
                        {1, 1, 1}};
    int B[MAX][MAX] = { {1, 2, 3},
                        {4, 5, 6},
                        {7, 8, 9}};
    cout << countOps(A, B, 3, 3) ;
    return 0;
}


Java
// Java program to find number of
// countOpsation to make two matrix
// equals
import java.io.*;
 
class GFG
{
     
    static int countOps(int A[][], int B[][],
                        int m, int n)
    {
         
        // Update matrix A[][] so that only
        // A[][] has to be countOpsed
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i][j] -= B[i][j];
     
        // Check necessary condition for
        // condition for existence of full
        // countOpsation
        for (int i = 1; i < n; i++)
            for (int j = 1; j < m; j++)
                if (A[i][j] - A[i][0] -
                    A[0][j] + A[0][0] != 0)
                    return -1;
     
        // If countOpsation is possible
        // calculate total countOpsation
        int result = 0;
         
        for (int i = 0; i < n; i++)
            result += Math.abs(A[i][0]);
             
        for (int j = 0; j < m; j++)
            result += Math.abs(A[0][j] - A[0][0]);
             
        return (result);
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int A[][] = { {1, 1, 1},
                      {1, 1, 1},
                      {1, 1, 1} };
                     
        int B[][] = { {1, 2, 3},
                      {4, 5, 6},
                      {7, 8, 9} };
                     
        System.out.println(countOps(A, B, 3, 3)) ;
 
    }
}
 
// This code is contributed by KRV.


Python3
# Python3 program to find number of
# countOpsation to make two matrix
# equals
def countOps(A, B, m, n):
 
    # Update matrix A[][] so that only
    # A[][] has to be countOpsed
    for i in range(n):
        for j in range(m):
            A[i][j] -= B[i][j];
 
    # Check necessary condition for
    # condition for existence of full
    # countOpsation
    for i in range(1, n):
        for j in range(1, n):
            if (A[i][j] - A[i][0] -
                A[0][j] + A[0][0] != 0):
                return -1;
 
    # If countOpsation is possible
    # calculate total countOpsation
    result = 0;
 
    for i in range(n):
        result += abs(A[i][0]);
 
    for j in range(m):
        result += abs(A[0][j] - A[0][0]);
 
    return (result);
 
# Driver code
if __name__ == '__main__':
    A = [[1, 1, 1],
         [1, 1, 1],
         [1, 1, 1]];
 
    B = [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9]];
          
    print(countOps(A, B, 3, 3));
 
# This code is contributed by Rajput-Ji


C#
// C# program to find number of
// countOpsation to make two matrix
// equals
using System;
 
class GFG
{
     
    static int countOps(int [,]A, int [,]B,
                        int m, int n)
    {
         
        // Update matrix A[][] so that only
        // A[][] has to be countOpsed
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i, j] -= B[i, j];
     
        // Check necessary condition for
        // condition for existence of full
        // countOpsation
        for (int i = 1; i < n; i++)
            for (int j = 1; j < m; j++)
                if (A[i, j] - A[i, 0] -
                    A[0, j] + A[0, 0] != 0)
                    return -1;
     
        // If countOpsation is possible
        // calculate total countOpsation
        int result = 0;
         
        for (int i = 0; i < n; i++)
            result += Math.Abs(A[i, 0]);
             
        for (int j = 0; j < m; j++)
            result += Math.Abs(A[0, j] - A[0, 0]);
             
        return (result);
    }
     
    // Driver code
    public static void Main ()
    {
        int [,]A = { {1, 1, 1},
                     {1, 1, 1},
                     {1, 1, 1} };
                         
        int [,]B = { {1, 2, 3},
                     {4, 5, 6},
                     {7, 8, 9} };
                         
    Console.Write(countOps(A, B, 3, 3)) ;
 
    }
}
 
// This code is contributed by nitin mittal.
PHP 


Javascript


输出:

12