C++で七セグメント表示の時刻から作れる時刻パターン数を求める方法
問題の概要
この問題では、電卓などでおなじみのグロー表示管(七セグメントディスプレイ)で表示された2桁の時刻が与えられます。求めるのは、表示中のセグメントを点灯・消灯させることで実現できる、他の時刻パターンの出現総数です。
七セグメントディスプレイとは
七セグメントディスプレイとは、7本の線分(セグメント)の点灯パターンを切り替えることで数字を表示できる表示装置のことです。電卓やデジタル時計など、身近な機器に広く採用されています。
七セグメントディスプレイの外観は以下のようになります。

問題例で理解しよう
具体例を使って問題を確認しましょう。
入力 − 7 5
出力 − 20
説明 − 十の位の「7」は、セグメントを付け足すことで「0」「3」「8」「9」、そして元のままの「7」を含めた5通りの数字に変化できます。同様に、一の位の「5」は「5」「6」「8」「9」の4通りです。よって、時刻全体の組み合わせ数は 5 × 4 = 20通りとなります。
解法の考え方
この問題を効率よく解くには、各数字(0〜9)について「セグメントを追加点灯するだけで表示できる数字の個数」をあらかじめ表として持っておくのが有効です。答えは、十の位と一の位に対応する値の積として求められます。
参考までに、各数字から作り出せるパターン数とその内訳は以下の通りです。
- 0:2通り(0、8)
- 1:7通り(0、1、3、4、7、8、9)
- 2:2通り(2、8)
- 3:3通り(3、8、9)
- 4:3通り(4、8、9)
- 5:4通り(5、6、8、9)
- 6:2通り(6、8)
- 7:5通り(0、3、7、8、9)
- 8:1通り(8)
- 9:2通り(8、9)
C++での実装例
上記の考え方をもとにしたプログラムの実装例がこちらです。
#include <iostream>
using namespace std;
int num[10] = { 2, 7, 2, 3, 3, 4, 2, 5, 1, 2 };
int AllPossibleTimmings(int timing) {
return ((num[timing/10]*num[timing%10]));
}
int main() {
int timing = 71;
cout<<"All Possible timings from "<<timing<<" are : "<<AllPossibleTimmings(timing);
return 0;
}
実行結果
All Possible timings from 71 are : 35
このプログラムでは、時刻「71」を入力としています。十の位「7」は5通り、一の位「1」は7通りに変化できるため、出力は 5 × 7 = 35 となります。
-
C++で生成可能なすべての完全二分木を列挙する方法
問題の概要 完全二分木(フルバイナリツリー)とは、すべてのノードが子をちょうど0個または2個持つ二分木のことです。この問題では、N個のノードから構成されるすべての完全二分木のリストを求めます。返される木の各ノードの値は0とし、木の並び順は問われません。例えば、入力が7の場合、以下のような木が生成されます。 なお、完全二分木のノード総数は必ず奇数(葉がn個なら全体で2n−1個)になるため、Nが偶数の場合は条件を満たす木が存在しない点にも注意が必要です。 解法のアプローチ この問題は、再帰とメモ化(計算結果のキャッシュ)を組み合わせることで効率的に解くことができます。具体的な手順は以下の通りで
-
DISPLAYなしでpyplotを使う方法|savefig()でグラフを画像として保存する
ディスプレイ(GUI)が利用できないサーバーやSSH接続先などの環境でも、matplotlibのpyplotを使ってグラフを作成することは可能です。画面に表示する代わりに、savefig()メソッドで現在の図をローカルマシン上の画像ファイルとして保存すれば、後から自由に確認できます。 手順 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。 numpyを使ってxデータポイントを作成します。 plot()メソッドでxとyのデータポイントをプロットします。 savefig()メソッドで図をファイルに保存します。 コード例 import numpy as np imp