C++でNxM行列を出力する:すべての行と列に全母音を含める方法
問題の概要
この問題では、n×mサイズの2次元行列を作成します。行列には母音だけを配置し、すべての行とすべての列に5つの母音(a・e・i・o・u)が必ず含まれるようにする必要があります。
「すべての母音が含まれる」という条件を満たすには、a・e・i・o・uの5文字が最低限必要となるため、行列の行数と列数はどちらも5以上でなければなりません。つまり、作成できる最小の行列は5×5です。
それでは、具体例を使って問題をより深く理解しましょう。
例1
入力 : N = 5、M = 5
出力 :
a e i o u
e i o u a
i o u a e
o u a e i
u a e i o解説 : 母音「a e i o u」が規則正しく、すべての行と列に配置されています。1行目は「aeiou」、2行目は「e」で始まる「eioua」、3行目は「iouae」というように、行が進むごとに並びを1つずつ左へローテーションさせています。この工夫により、縦方向の列にもすべての母音が現れます。
例2
入力 : N = 3、M = 4 出力 : 行列を作成できません(Matrix cannot be created.)
解説 : NおよびMの最小値は5であるため、それ未満の値が入力された場合には行列を作成できません。
解き方のアプローチ
この問題は、以下の手順で解くことができます。
- まず前提条件として、NまたはMが5未満の場合は「行列を作成できません」というメッセージを出力して処理を終了します。
- 条件を満たしている場合は、基本となる文字列「aeiou」を使って行列を構築していきます。
- 新しい行を出力するたびに、この並びを1つずつ左に回転させます(「aeiou」→「eioua」→「iouae」…)。
- 実装の際は、文字列を実際に回転させる必要はありません。
s[(j + i) % 5]のようにインデックスを計算すれば、同じ結果をシンプルかつ効率的に得られます。
C++による実装例
#include <iostream>
using namespace std;
void vowelMatrix(int n, int m) {
if (n < 5 || m < 5) {
cout << "Matrix cannot be created!" << endl;
return;
}
string s = "aeiou";
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << s[(j + i) % 5] << " ";
}
cout << endl;
}
}
int main() {
int n = 5, m = 5;
vowelMatrix(n, m);
return 0;
}出力結果
a e i o u e i o u a i o u a e o u a e i u a e i o
計算量
時間計算量 : O(n × m) — 行列の各セルを1度ずつ処理します。
空間計算量 : O(1) — 長さ5の固定文字列以外に追加のメモリは不要です。
-
C++で無向グラフ内のすべてのサイクル(閉路)を検出して出力する方法
問題の概要 この記事では、無向グラフが与えられたときに、そのグラフ内に形成されるすべてのサイクル(閉路)を検出して出力する方法を解説します。 無向グラフとは、頂点同士が双方向で接続されているグラフのことです。すべての辺に方向がなく自由に行き来できるため、「無向ネットワーク」とも呼ばれます。 サイクル(閉路)とは、グラフデータ構造において、頂点の並びが一周して出発点に戻るような閉じた経路を形成しているものを指します。 まず、具体例を見て理解を深めましょう。 入力グラフ: 出力: Cycle 1: 2 3 4 5 Cycle 2: 6 7 8 この例では、頂点2〜5で構成されるサイクルと、頂点6
-
C++で木構造のノード数が奇数・偶数となるレベルをすべて出力する方法
この記事では、木(ツリー)構造が与えられたときに、各レベルに含まれるノードの数を調べ、その数が奇数であるレベルと偶数であるレベルをそれぞれ出力する方法を、C++のサンプルコード付きで解説します。 問題の概要 まず、具体的な例を使って概念を確認しましょう。次のような木構造を考えます。 出力: ノード数が奇数のレベル:1, 3, 4 ノード数が偶数のレベル:2 解説: 第1レベルにはノードが1個(奇数)、第2レベルには2個(偶数)、第3レベルには3個(奇数)、第4レベルには1個(奇数)存在します。そのため、奇数となるのは「1, 3, 4」のレベル、偶数となるのは「2」のレベルです。 解き方