Дато два матрице а и б величине н*м . Задатак је пронаћи тражено број корака трансформације тако да обе матрице постану једнаке. Принт -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 мора да важи за свако ваљано решење. Ако ова једначина не важи ни за једну ћелију, то значи да ниједан низ операција реда и колоне не може трансформисати једну матрицу у другу.
Израчунајте број потребних трансформација:
C++Да бисмо израчунали број потребних трансформација, потребно је само да погледамо први ред и прва колона јер:
- Прво сумирамо |а[и][0]| за све и (сваки први елемент колоне) јер ово представља колико нам је потребно операција у редовима. За сваки ред и треба нам |а[и][0]| операције да тај елемент реда буде нула.
- Онда сумирамо |а[0][ј] - а[0][0]| за све ј (сваки први елемент реда минус први елемент) јер ово представља потребне додатне операције колоне. Одузимамо [0][0] да бисмо избегли да га пребројимо двапут пошто су операције реда већ утицале на овај елемент.
- Збир ова два нам даје минимални број операција потребно јер операције редова обрађују прве разлике у колони, а операције колоне преостале разлике у првом реду.
// 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)