logo

Наћи број трансформације да би две матрице биле једнаке

Дато два матрице а и б величине н*м . Задатак је пронаћи тражено број корака трансформације тако да обе матрице постану једнаке. Принт -1 ако то није могуће. 

Тхе трансформација корак је следећи: 

  • Изаберите било коју матрицу од две матрице. 
  • Изаберите било које ред/колона изабране матрице. 
  • Повећајте сваки елемент селекције ред/колона од 1. 

Примери: 



Улаз:
а[][] = [[1 1]
[1 1]]

б[][] = [[1 2]
[3 4]]

Излаз : 3
Објашњење :
[[1 1] -> [[1 2] -> [[1 2] -> [[1 2]
[1 1]] [1 2]] [2 3]] [3 4]]

Инпут :
а[][] = [[1 1]
[1 0]]

б[][] = [[1 2]
[3 4]]

Излаз : -1
Објашњење : Ниједна трансформација неће учинити а и б једнакима.

приступ:

Идеја је то повећавајући било који ред/колона у матрица а је еквивалентно декрементирање исти ред/колона у матрица б .

То значи да уместо праћења обе матрице можемо да радимо са њиховом разликом (а[и][ј] - б[и][ј]). Када повећамо ред у ' а' сви елементи у том реду се повећавају за 1 што је исто као и сви елементи у том реду матрице разлике повећавају се за 1. Слично када повећамо колону у ' а' то је еквивалентно повећању свих елемената у тој колони матрице разлика за 1.

Ово нам омогућава да трансформишемо проблем у рад са само једном матрицом.

Утврдите да ли неко решење постоји или не:

Након креирања матрица разлика за сваку ћелију а[и][ј] (без првог реда и прве колоне) проверавамо да ли

а[и][ј] - а[и][0] - а[0][ј] + а[0][0] = 0.

Ако ова једначина не важи ни за једну ћелију, одмах можемо закључити да решење не постоји.

Зашто ово функционише?
Размислите како ред и колона операције утичу на сваку ћелију: када вршимо к операције на ред и и и операције на колони ј а[и][ј] мења за (к + и) а[и][0] промене за к (само операције редова) а[0][ј] промене за и (само операције са колонама) и а[0][0] утиче ни ред и ни колона ј операције. Стога (к + и) - к - и + 0 = 0 мора да важи за свако ваљано решење. Ако ова једначина не важи ни за једну ћелију, то значи да ниједан низ операција реда и колоне не може трансформисати једну матрицу у другу.

Израчунајте број потребних трансформација:

Да бисмо израчунали број потребних трансформација, потребно је само да погледамо први ред и прва колона јер:

  1. Прво сумирамо |а[и][0]| за све и (сваки први елемент колоне) јер ово представља колико нам је потребно операција у редовима. За сваки ред и треба нам |а[и][0]| операције да тај елемент реда буде нула.
  2. Онда сумирамо |а[0][ј] - а[0][0]| за све ј (сваки први елемент реда минус први елемент) јер ово представља потребне додатне операције колоне. Одузимамо [0][0] да бисмо избегли да га пребројимо двапут пошто су операције реда већ утицале на овај елемент.
  3. Збир ова два нам даје минимални број операција потребно јер операције редова обрађују прве разлике у колони, а операције колоне преостале разлике у првом реду.
C++
// C++ program to find number of transformation // to make two Matrix Equal #include    using namespace std; int countOperations(vector<vector<int>> &a vector<vector<int>> &b) {  int n = a.size();  int m = a[0].size();   // Create difference matrix (a = a - b)  for (int i = 0; i < n; i++) {  for (int j = 0; j < m; j++) {  a[i][j] -= b[i][j];  }  }  // Check if transformation is possible using the property  // a[i][j] - a[i][0] - a[0][j] + a[0][0] should be 0  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;  }  }  }  int result = 0;  // Add operations needed for first column  for (int i = 0; i < n; i++) {  result += abs(a[i][0]);  }  // Add operations needed for  // first row (excluding a[0][0])  for (int j = 0; j < m; j++) {  result += abs(a[0][j] - a[0][0]);  }  return result; } int main() {    vector<vector<int>> a = {{1 1} {1 1}};  vector<vector<int>> b = {{1 2} {3 4}};  cout << countOperations(a b);  return 0; } 
Java
// Java program to find number of transformation // to make two Matrix Equal import java.util.*; class GfG {  static int countOperations(int[][] a int[][] b) {  int n = a.length;  int m = a[0].length;  // Create difference matrix (a = a - b)  for (int i = 0; i < n; i++) {  for (int j = 0; j < m; j++) {  a[i][j] -= b[i][j];  }  }  // Check if transformation is possible using the  // property a[i][j] - a[i][0] - a[0][j] + a[0][0]  // should be 0  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;  }  }  }  int result = 0;  // Add operations needed for first column  for (int i = 0; i < n; i++) {  result += Math.abs(a[i][0]);  }  // Add operations needed for  // first row (excluding a[0][0])  for (int j = 0; j < m; j++) {  result += Math.abs(a[0][j] - a[0][0]);  }  return result;  }  public static void main(String[] args) {  int[][] a = { { 1 1 } { 1 1 } };  int[][] b = { { 1 2 } { 3 4 } };  System.out.println(countOperations(a b));  } } 
Python
# Python program to find number of transformation # to make two Matrix Equal def countOperations(a b): n = len(a) m = len(a[0]) # Create difference matrix (a = a - b) for i in range(n): for j in range(m): a[i][j] -= b[i][j] # Check if transformation is possible using the property # a[i][j] - a[i][0] - a[0][j] + a[0][0] should be 0 for i in range(1 n): for j in range(1 m): if a[i][j] - a[i][0] - a[0][j] + a[0][0] != 0: return -1 result = 0 # Add operations needed for first column for i in range(n): result += abs(a[i][0]) # Add operations needed for # first row (excluding a[0][0]) for j in range(m): result += abs(a[0][j] - a[0][0]) return result if __name__ == '__main__': a = [ [1 1] [1 1] ] b = [ [1 2] [3 4] ] print(countOperations(a b)) 
C#
// C# program to find number of transformation // to make two Matrix Equal using System; class GfG {  static int countOperations(int[ ] a int[ ] b) {  int n = a.GetLength(0);  int m = a.GetLength(1);  // Create difference matrix (a = a - b)  for (int i = 0; i < n; i++) {  for (int j = 0; j < m; j++) {  a[i j] -= b[i j];  }  }  // Check if transformation is possible using the  // property a[i j] - a[i 0] - a[0 j] + a[0 0]  // should be 0  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;  }  }  }  int result = 0;  // Add operations needed for first column  for (int i = 0; i < n; i++) {  result += Math.Abs(a[i 0]);  }  // Add operations needed for  // first row (excluding a[0 0])  for (int j = 0; j < m; j++) {  result += Math.Abs(a[0 j] - a[0 0]);  }  return result;  }  static void Main(string[] args) {    int[ ] a = { { 1 1 } { 1 1 } };  int[ ] b = { { 1 2 } { 3 4 } };  Console.WriteLine(countOperations(a b));  } } 
JavaScript
// JavaScript program to find number of transformation // to make two Matrix Equal function countOperations(a b) {  let n = a.length;  let m = a[0].length;  // Create difference matrix (a = a - b)  for (let i = 0; i < n; i++) {  for (let j = 0; j < m; j++) {  a[i][j] -= b[i][j];  }  }  // Check if transformation is possible using the  // property a[i][j] - a[i][0] - a[0][j] + a[0][0] should  // be 0  for (let i = 1; i < n; i++) {  for (let j = 1; j < m; j++) {  if (a[i][j] - a[i][0] - a[0][j] + a[0][0]  !== 0) {  return -1;  }  }  }  let result = 0;  // Add operations needed for first column  for (let i = 0; i < n; i++) {  result += Math.abs(a[i][0]);  }  // Add operations needed for  // first row (excluding a[0][0])  for (let j = 0; j < m; j++) {  result += Math.abs(a[0][j] - a[0][0]);  }  return result; } //Driver code let a = [ [ 1 1 ] [ 1 1 ] ]; let b = [ [ 1 2 ] [ 3 4 ] ]; console.log(countOperations(a b)); 

Излаз
3

Временска сложеност: О(н*м)
Помоћни простор: О(1)

Креирај квиз