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