logo

Etsi muunnoksen lukumäärä, jotta kaksi matriisia ovat yhtä suuret

Annettu kaksi matriisit a ja b kooltaan n*m . Tehtävänä on löytää tarvittava muunnosvaiheiden määrä niin, että molemmat matriisit ovat yhtä suuret. Painaa -1 jos tämä ei ole mahdollista. 

The muunnos vaihe on seuraava: 

  • Valitse mikä tahansa matriisi kahdesta matriisista. 
  • Valitse jompikumpi rivi/sarake valitusta matriisista. 
  • Kasvata valinnan jokaista elementtiä rivi/sarake mennessä 1. 

Esimerkkejä: 



Syöte:
a[][] = [[1 1]
[1 1]]

b[][] = [[1 2]
[3 4]]

Lähtö : 3
Selitys :
[[1 1] -> [[1 2] -> [[1 2] -> [[1 2]
[1 1]] [1 2]] [2 3]] [3 4]]

Syöte :
a[][] = [[1 1]
[10]]

b[][] = [[1 2]
[3 4]]

Lähtö : -1
Selitys : Mikään muunnos ei tee a:ta ja b:tä yhtäläisiksi.

Lähestyä:

Ideana on se kasvaa mikä tahansa rivi/sarake sisään matriisi a on vastaava vähenevä sama rivi/sarake sisään matriisi b .

Tämä tarkoittaa, että molempien matriisien seurannan sijaan voimme työskennellä niiden eron kanssa (a[i][j] - b[i][j]). Kun lisäämme riviä a' kaikki kyseisen rivin elementit kasvavat 1:llä, mikä on sama kuin kaikki eromatriisin rivin elementit, jotka kasvavat 1:llä. Vastaavasti kun lisäämme saraketta a' se vastaa eromatriisin sarakkeen kaikkien elementtien lisäämistä yhdellä.

Tämän avulla voimme muuttaa ongelman työskentelyyn vain yhden matriisin kanssa.

Selvitä, onko ratkaisu olemassa vai ei:

Luomisen jälkeen eromatriisi jokaiselle solulle a[i][j] (lukuun ottamatta ensimmäistä riviä ja ensimmäistä saraketta) tarkistamme, jos

a[i][j] - a[i][0] - a[0][j] + a[0][0] = 0.

Jos tämä yhtälö ei päde millekään solulle, voimme välittömästi päätellä, että ratkaisua ei ole olemassa.

Miksi tämä toimii?
Mieti kuinka rivi ja sarake toiminnot vaikuttavat jokaiseen soluun: kun suoritamme x toiminnot rivillä i ja ja sarakkeen toiminnot j a[i][j] muuttuu (x + y) a[i][0] muuttuu x:llä (vain rivitoiminnot) a[0][j] muuttuu y:llä (vain saraketoiminnot) ja a[0][0]:aan vaikuttaa ei riviä i eikä saraketta j toiminnot. Siksi (x + y) - x - y + 0 = 0 on oltava voimassa kaikille kelvollisille ratkaisuille. Jos tämä yhtälö ei päde millekään solulle, se tarkoittaa, että mikään rivi- ja saraketoimintojen sarja ei voi muuttaa matriisia toiseksi.

Laske tarvittavien muunnosten lukumäärä:

Tarvittavien muunnosten määrän laskemiseksi meidän tarvitsee vain tarkastella ensimmäinen rivi ja ensimmäinen sarake koska:

  1. Teemme ensin yhteenvedon |a[i][0]| kaikille i:lle (jokaiselle ensimmäisen sarakkeen elementille), koska tämä tarkoittaa, kuinka monta rivioperaatiota tarvitsemme. Jokaiselle riville i tarvitsemme |a[i][0]| toimintoja, joilla rivielementistä tulee nolla.
  2. Sitten teemme yhteenvedon |a[0][j] - a[0][0]| kaikille j:lle (jokainen ensimmäisen rivin elementti miinus ensimmäinen elementti), koska tämä edustaa tarvittavia lisäsaraketoimintoja. Vähennämme a[0][0], jotta sitä ei lasketa kahdesti, koska rivitoiminnot ovat jo vaikuttaneet tähän elementtiin.
  3. Näiden kahden summa antaa meille toimintojen vähimmäismäärä tarvitaan, koska rivioperaatiot käsittelevät ensimmäisen sarakkeen erot ja sarakeoperaatiot käsittelevät ensimmäisen rivin jäljellä olevat erot.
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)); 

Lähtö
3

Aika monimutkaisuus: O(n*m)
Aputila: O(1)

Luo tietokilpailu