C++で画像がカラーか白黒かを判定する方法
本記事では、与えられた画像がカラ―画像か白黒(モノクロ)画像かを判定するC++プログラムを紹介します。
問題の概要
n個のピクセルから構成される画像が与えられます。各ピクセルは以下のいずれかの色を持つとします。
- 'C'(シアン)
- 'M'(マゼンタ)
- 'Y'(イエロー)
- 'W'(ホワイト)
- 'G'(グレー)
- 'B'(ブラック)
i番目のピクセルの色は文字列 'pixels' として渡されます。この文字列をもとに、その写真がカラーか白黒かを判定します。
判定基準は次のとおりです。
- ピクセルの中に 'C'、'M'、'Y' のいずれかが1つでも含まれていれば、それはカラー写真であり、「Color」と出力します。
- すべてのピクセルが 'W'、'G'、'B' のみで構成されていれば、それは白黒写真であり、「BW」と出力します。
入力例
n = 10、pixels = "GBWYM" の場合、出力は「Color」になります。これは 'Y' と 'M' というカラー用のピクセルが含まれているためです。
アルゴリズムの手順
この問題は、以下の手順で解くことができます。
- 0からn-1までの各ピクセルを順番に走査します。
- あるピクセルが 'B'、'W'、'G' のいずれにも一致しない場合、その時点で「Color」を出力して処理を終了します。
- ループが最後まで完了した場合(つまり、すべてのピクセルが 'B'、'W'、'G' のいずれかだった場合)、「BW」を出力します。
擬似コード
for initialize i := 0, when i < n, update (increase i by 1), do:
if pixels[i] is not equal to 'B' and pixels[i] is not equal to 'W' and pixels[i] is not equal to 'G', then:
print("Color")
return
print("BW")C++による実装例
理解を深めるために、実際の実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
#define N 100
void solve(int n, string pixels ) {
for (int i = 0 ; i < n; i++) {
if(pixels[i]!='B' && pixels[i]!='W' && pixels[i]!='G') {
cout<<"Color";
return;
}
}
cout<<"BW";
}
int main() {
int n = 10;
string pixels = "GBWYM";
solve(n, pixels);
return 0;
}入力
10, "GBWYM"
出力
Color
コードの解説
solve関数では、文字列pixelsを先頭から1文字ずつ確認しています。条件式 pixels[i]!='B' && pixels[i]!='W' && pixels[i]!='G' により、現在のピクセルが白黒系の色(ブラック・ホワイト・グレー)以外であるかどうかをチェックします。
もし1つでもカラー系の色(シアン・マゼンタ・イエロー)が見つかった場合は、即座に「Color」を出力して関数を終了します。これにより、無駄なループ処理を省き、効率的に判定できます。
すべてのピクセルが白黒系だった場合は、ループを抜けて「BW」が出力されます。
計算量
- 時間計算量: O(n) — 各ピクセルを最大1回ずつ調べるためです。
- 空間計算量: O(1) — 追加の記憶領域はほとんど必要ありません。
このように、シンプルな線形探索によって画像がカラーか白黒かを簡単に判定できることがわかりました。
-
C++でnラウンド制ゲームの勝者を判定するコード
2人のプレイヤーが対戦するnラウンド制のゲームを考えてみましょう。各ラウンドのスコアは配列「scores」で与えられ、各要素は{P1のスコア, P2のスコア}という形式になっています。各ラウンドではスコアが高い方のプレイヤーがそのラウンドに勝利し、より多くのラウンドを制したプレイヤーがゲーム全体の勝者となります。両者の勝利数が同じ場合は引き分けと判定されます。この記事では、与えられたスコアをもとに、誰がゲームに勝ったのかを判定するプログラムをC++で実装します。例えば、入力が n = 4、scores = {{4, 3}, {3, 2}, {5, 6}, {2, 5}} の場合、出力は「Dra
-
C++でバッテリーの組み合わせ数を求めるアルゴリズム
最大5回まで使用できるバッテリーがn本あるとします。ここで、3本のバッテリーを必要とするデバイスがあり、デバイスを使用するたびにバッテリーの使用回数が1ずつ増加します。デバイスをk回使用したい場合、それらを動かすために何通りのバッテリーの組み合わせを作れるかを求める必要があります。ただし、1本のバッテリーを複数のデバイスで同時に使用することはできず、すでに5回使用されたバッテリーは組み合わせに含められません。各バッテリーの現在の使用回数は配列battとして与えられます。例えば、入力が n = 6、k = 2、batt = {2, 4, 4, 2, 1, 3} の場合、出力は 1 になります。こ