C++
 Computer >> コンピューター >  >> プログラミング >> C++

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' というカラー用のピクセルが含まれているためです。

アルゴリズムの手順

この問題は、以下の手順で解くことができます。

  1. 0からn-1までの各ピクセルを順番に走査します。
  2. あるピクセルが 'B'、'W'、'G' のいずれにも一致しない場合、その時点で「Color」を出力して処理を終了します。
  3. ループが最後まで完了した場合(つまり、すべてのピクセルが '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) — 追加の記憶領域はほとんど必要ありません。

このように、シンプルな線形探索によって画像がカラーか白黒かを簡単に判定できることがわかりました。

  1. C++でnラウンド制ゲームの勝者を判定するコード

    2人のプレイヤーが対戦するnラウンド制のゲームを考えてみましょう。各ラウンドのスコアは配列「scores」で与えられ、各要素は{P1のスコア, P2のスコア}という形式になっています。各ラウンドではスコアが高い方のプレイヤーがそのラウンドに勝利し、より多くのラウンドを制したプレイヤーがゲーム全体の勝者となります。両者の勝利数が同じ場合は引き分けと判定されます。この記事では、与えられたスコアをもとに、誰がゲームに勝ったのかを判定するプログラムをC++で実装します。例えば、入力が n = 4、scores = {{4, 3}, {3, 2}, {5, 6}, {2, 5}} の場合、出力は「Dra

  2. C++でバッテリーの組み合わせ数を求めるアルゴリズム

    最大5回まで使用できるバッテリーがn本あるとします。ここで、3本のバッテリーを必要とするデバイスがあり、デバイスを使用するたびにバッテリーの使用回数が1ずつ増加します。デバイスをk回使用したい場合、それらを動かすために何通りのバッテリーの組み合わせを作れるかを求める必要があります。ただし、1本のバッテリーを複数のデバイスで同時に使用することはできず、すでに5回使用されたバッテリーは組み合わせに含められません。各バッテリーの現在の使用回数は配列battとして与えられます。例えば、入力が n = 6、k = 2、batt = {2, 4, 4, 2, 1, 3} の場合、出力は 1 になります。こ