C++で小屋のパターンを出力するプログラム
このチュートリアルでは、星印(*)を使ってコンソールに小屋のパターンを出力するC++プログラムを解説します。
この問題では、出力する小屋の幅 N が与えられます。求められるのは、指定された幅に合わせて星印で小屋の外枠を描き、さらに小屋の内部に縦線(|)と下線(_)を使ってドアを表現することです。
アルゴリズムのポイント
- 入力値 N が偶数の場合は 1 を加えて奇数に調整し、図形の対称性を保ちます。
- 屋根の傾斜は「行番号+列番号」「列番号−行番号」が特定の値になるかどうかで判定し、星印を配置します。
- 壁や床は、最上部・最下部・左右両端の座標条件によって星印を描き分けます。
- ドアは N/7 を基準とした位置に、上端を下線(_)、側面を縦線(|)で表現します。
サンプルコード
#include <iostream>
using namespace std;
// 与えられた幅で小屋の構造を出力する
int print_hut(int n){
int i, j, t;
// 幅が偶数の場合は奇数に調整
if (n % 2 == 0) {
n++;
}
for (i = 0; i <= n - n / 3; i++) {
for (j = 0; j < n; j++) {
t = 2 * n / 5;
if (t % 2 != 0) {
t--;
}
// 先頭文字からの距離を計算し、
// 小屋の外枠を描画
if (i == n / 5
|| i == n - n / 3
|| (j == n - 1 && i >= n / 5)
|| (j >= n / 5 && j < n - n / 5 && i == 0)
|| (j == 0 && i >= n / 5)
|| (j == t && i > n / 5)
|| (i <= n / 5 && (i + j == n / 5 || j - i == n / 5))
|| (j - i == n - n / 5)) {
cout << "*";
}
// ドアの構造を描画
else if (i == n / 5 + n / 7 && (j >= n / 7 && j <= t - n / 7)) {
cout << "_";
}
else if (i >= n / 5 + n / 7 && (j == n / 7 || j == t - n / 7)) {
cout << "|";
}
else {
cout << " ";
}
}
cout << "\n";
}
}
int main(){
int n = 12;
print_hut(n);
return 0;
}
出力結果
********** * * * ************* *___* * *| |* * *| |* * *| |* * *| |* * *| |* * *************
このように、各座標に対する条件分岐を組み合わせることで、星印だけでも小屋らしいパターンを描くことができます。main 関数内の n の値を変更すれば、さまざまなサイズの小屋を出力できるので、ぜひ試してみてください。
-
C++で数値のパリティ(奇偶性)を求めるプログラム
このチュートリアルでは、C++を使って数値のパリティ(奇偶性)を求める方法について解説します。パリティとは、ある数値を2進数で表したときに含まれる「1」の個数が、奇数であるか偶数であるかを指します。本記事では、入力として与えられた数値のパリティを効率的に判定するアルゴリズムを紹介します。パリティの求め方ここで紹介する手法では、ビット演算を活用します。ポイントとなるのは n & (n - 1) という式です。この式は、n の最下位にある「1」のビットを消去する働きがあります。この操作を n が 0 になるまで繰り返し、ループが回った回数(=1のビットの個数)から奇偶を判定します。C++での実装例
-
C++で二分木を見やすい形式で2次元配列に出力する方法
本記事では、二分木(バイナリツリー)を m×n の2次元文字列配列として整形して出力する方法を解説します。出力には以下のルールが適用されます。行数 m は、与えられた二分木の高さと一致すること。列数 n は、必ず奇数になること。ルートノードの値は、最初の行のちょうど中央に配置する。ルートノードが存在する行と列によって、残りの領域は「左下」と「右下」の2つの部分に分割される。左側の部分木は左下の領域へ、右側の部分木は右下の領域へそれぞれ出力する。左右の領域は同じサイズとする。片方の部分木が存在しない場合でも、何も出力はしないものの、もう一方の部分木と同じサイズの領域は確保しておく必要がある。ただ