C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で2つの行列を等しくするための変換の数を見つけます


この問題では、同じサイズの2つの行列mat1[][]とmat2[][]が与えられます。私たちの仕事は、2つの行列を等しくするための変換の数を見つけることです。

変換1の行列は-

です
  • 2つの行列の任意の行列を選択します。

  • 行列から行または列を選択します

  • 選択した行または列のすべての要素に1を追加します。

問題を理解するために例を見てみましょう

入力

mat1[][] = {{1 2}
{2 1}}
mat1[][] = {{2 3}
{4 3}}

出力

3

説明

1 2 => 2 2 => 2 3 => 2 3
2 1 => 3 1 => 3 2 => 4 3

ソリューションアプローチ

この問題の簡単な解決策は、変換が可能かどうかを調べることです。このために、チェックする必要があります-

if( mat[i][j] - mat[i][0] - mat[0][j] + mat[0][0] != 0 )

その場合、解決策はありません。

ここで、変換が可能な場合は、行と列の変換をカウントします。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
const int MAX = 100;
int countTransformationReq(int mat1[][MAX], int mat2[][MAX],
int m, int n) {
   for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++)
         mat1[i][j] -= mat2[i][j];
      for (int i = 1; i < n; i++)
         for (int j = 1; j < m; j++)
            if (mat1[i][j] - mat1[i][0] - mat1[0][j] +
               mat1[0][0] != 0)
   return -1;
   int trxCount = 0;
   for (int i = 0; i < n; i++)
      trxCount += abs(mat1[i][0]);
   for (int j = 0; j < m; j++)
      trxCount += abs(mat1[0][j] - mat1[0][0]);
   return (trxCount);
}
int main() {
   int mat1[MAX][MAX] = { {1, 2}, {2, 1}};
   int mat2[MAX][MAX] = { {2, 3}, {4, 3}};
   cout<<"The number of transformation to make the teo
   maxtrces equal are "<<countTransformationReq(mat1, mat2, 2,
   2) ;
   return 0;
}

出力

The number of transformation to make the teo maxtrces equal are 3

効率的なアプローチ

この問題のより効果的な解決策は、ハンドシェイク式を使用することです。

temp []配列を作成して、配列のモジュロでの0と1の出現をカウントします。そして、カウント値を返します。

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
int countEvenSumSubArray(int arr[], int n){
   int temp[2] = {1, 0};
   int count = 0, sum = 0;
   for (int i=0; i<=n-1; i++){
      sum = ( (sum + arr[i]) % 2 + 2) % 2;
      temp[sum]++;
   }
   count += (temp[0]*(temp[0]-1)/2);
   count += (temp[1]*(temp[1]-1)/2);
   return (count);
}
int main(){
   int arr[] = {2, 1, 4, 2};
   int n = sizeof (arr) / sizeof (arr[0]);
   cout<<"The count of Subarrays with even sum is "<<countEvenSumSubArray(arr, n);
   return (0);
}

出力

The count of Subarrays with even sum is 4

  1. C++で有理数のLCMを見つける

    ここでは、有理数のLCMを見つける方法を説明します。有理数のリストがあります。リストが{2/7、3 / 14、5 / 3}のようであるとすると、LCMは30/1になります。 この問題を解決するには、すべての分子のLCMを計算し、次にすべての分母のgcdを計算し、次に有理数のLCMを計算する必要があります- $$ LCM =\ frac {LCM \:of \:all \:𝑛𝑢𝑚𝑒𝑟𝑎𝑡𝑜𝑟𝑠} {GCD \:of \:all \:𝑑𝑒𝑛𝑜𝑚𝑖𝑖 例 #include <iostream> #include <vector> #inc

  2. マトリックス内の2つのセル間にパスがあるかどうかを確認するC++プログラム

    この記事では、特定のマトリックス内の2つのセル間にパスが存在するかどうかを確認するプログラムについて説明します。 可能な値が0、1、2、3の正方行列が与えられたとしましょう。ここでは 0は空白の壁を意味します 1はソースを意味します 2は目的地を意味します 3は空白セルを意味します マトリックスには、送信元と宛先を1つだけ含めることができます。プログラムは、指定されたマトリックス内に、斜めではなく4つの可能なすべての方向に移動する、送信元から宛先への可能なパスがあるかどうかを確認することです。 例 #include<bits/stdc++.h> using namespac