找到使两个矩阵相等的变换数
给定两个 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