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

C++:行列内のA[i][j]=0となるインデックス(i, j)の最大差を求める方法

本記事では、n×nのサイズを持つ行列が与えられたとき、a[i][j] = 0となる要素のインデックス(i, j)の差の最大値を求める方法を解説します。この問題では、行列内に少なくとも1つの0が存在することが前提となります。

例で理解しよう

入力例1

int matrix[][] = {
   {0, 1, 1},
   {0, 0, 0},
   {4, 5, 1}}

出力

A[i][j] = 0となるインデックス(i, j)の最大差:1

説明

この行列では、matrix[0][0]、matrix[1][0]、matrix[1][1]、matrix[1][2]の位置に0が存在します。各位置における|i − j|の値を計算すると、matrix[1][0]のとき|1 − 0| = 1が最大となり、したがって最大差は1です。

入力例2

int matrix[][] = {
   {0, 1, 1},
   {0, 2, 9},
   {4, 0, 1}}

出力

A[i][j] = 0となるインデックス(i, j)の最大差:1

説明

この行列では、matrix[0][0]、matrix[1][0]、matrix[2][1]の位置に0が存在します。それぞれの|i − j|を比較しても最大値は1であるため、最大差は1となります。

プログラムで使用するアプローチ

  • 少なくとも1つの0を含む行列を入力として受け取ります。
  • 行と列の最大サイズ(n×n)を定義します。
  • 最大差の値を格納するための一時変数を用意します。
  • iを0から行サイズまでループさせます。
  • その内側で、jを0から列サイズまでループさせます。
  • matrix[i][j] == 0であるかどうかを判定します。
  • 条件を満たす場合、インデックスの差(abs(i − j))と現在の最大値を比較し、大きい方を新しい最大値として更新します。
  • すべてのループが終了したら、最大値を返します。
  • 結果を出力します。

実装例

#include <bits/stdc++.h>
using namespace std;
#define row 3
#define col 3
// 最大差を求める関数
int maximum(int matrix[row][col]){
   int max_val = 0;
   for (int i = 0; i < row; i++){
      for (int j = 0; j < col; j++){
         if (matrix[i][j] == 0){
            max_val = max(max_val, abs(i - j));
         }
      }
   }
   return max_val;
}
int main(){
   int matrix[row][col] = {
      { 1, 2, 0},
      { 0, 4, 0},
      { 0, 1, 0}};
   cout<<"Maximum difference of indices with A[i][j] = 0 is: "<<maximum(matrix);
   return 0;
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

Maximum difference of indices with A[i][j] = 0 is: 2

このコードでは、0が存在する位置はmatrix[0][2]、matrix[1][0]、matrix[1][2]、matrix[2][0]、matrix[2][2]であり、それぞれの|i − j|は2、1、1、2、0となります。したがって、最大差は2という結果になります。

  1. C++で指定された条件を満たす部分集合の個数を数える方法

    数値の配列 arr[] と整数 x が入力として与えられたとき、次の条件を満たす部分集合(サブセット)をすべて見つけたいと思います。その条件とは、「部分集合に含まれる各要素が x で割り切れ、かつそれらの合計も x で割り切れる」というものです。 例 入力 arr[] = {1,2,3,4,5,6} x=3 出力 条件を満たす部分集合の個数:3 説明 該当する部分集合は以下の通りです: [3], [6], [3,6] 入力 arr[] = {1,2,3,4,5,6} x=4 出力 条件を満たす部分集合の個数:1 説明 該当する部分集合は以下の通りです: [4] このプログラムで採用しているア

  2. 【C++】部分木がBSTでもある二分木における最大部分木合計の求め方

    問題概要 この問題では、二分木 BT が与えられ、「その部分木自身も二分探索木(BST)である」という条件を満たす部分木の中から、ノード値の合計が最大となるものを見つけるプログラムを作成します。 二分木(Binary Tree)とは 二分木とは、各ノードが最大2つの子ノードを持つことができる特殊な木構造です。 二分探索木(BST)とは 二分探索木とは、すべてのノードが以下の性質を満たす木のことです。 左部分木のキー値は、親(ルート)ノードのキー値より小さい。 右部分木のキー値は、親(ルート)ノードのキー値以上である。 入出力例 入力: 出力: 32 説明:この木には BST として成立し