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

C++で3×3パターンが中心対称かどうかを判定する方法

問題概要

「X」と「.」から構成される 3 × 3 の行列を考えます。このパターンが中心対称(点対称)であるかどうかを判定します。中心対称とは、図形の中心点を基準に 180 度回転させても元の形と完全に重なるような対称性のことです。

たとえば、次のような入力が与えられた場合を考えてみましょう。

XX.
...
.XX

この場合、出力は True(真)になります。各マスを中心に対して反転させると、すべての要素が一致するためです。

解法のステップ

この問題を解くには、以下の条件でチェックを行います。

M[0, 0] == M[2, 2] かつ
M[0, 1] == M[2, 1] かつ
M[0, 2] == M[2, 0] かつ
M[1, 0] == M[1, 2]
がすべて成り立てば true を返す
そうでなければ false を返す

ポイントは、中心の要素 M[1][1] は自分自身との比較になるため、チェックする必要がないという点です。したがって、対比すべきペアは外周の 8 マスだけで済みます。

実装例

理解を深めるために、以下の C++ 実装を見てみましょう。

#include <bits/stdc++.h>
using namespace std;
bool solve(vector<vector<char>> M){
    if (M[0][0] == M[2][2] && M[0][1] == M[2][1] && M[0][2] == M[2][0] && M[1][0] == M[1][2])
        return true;
    else
        return false;
}
int main(){
    vector<vector<char>> matrix = { { 'X', 'X', '.' }, { '.', '.', '.' }, { '.', 'X', 'X' } };
    cout << solve(matrix) << endl;
}

入力

{ { 'X', 'X', '.' }, { '.', '.', '.' }, { '.', 'X', 'X' } }

出力

1

solve 関数は bool 値を返すため、true の場合は標準出力に 1 が表示されます。これは、与えられた行列が中心対称であることを示しています。計算量は行列サイズが固定のため O(1) となり、非常に効率的な判定方法です。

  1. C++で二分木が同型(アイソモーフィック)かどうかを判定する方法

    二分木では、各ノードが「左の子」と「右の子」という2つの子ノードを持ちます。ここでは、2つの二分木が与えられたとき、一方の木を左右反転(フリップ)することでもう一方の木が得られるかどうかを判定する問題を解説します。一方の木を反転することでもう一方の木と同じ構造が得られる場合、その2つの木は「同型(アイソモーフィック)」であると定義されます。具体例入力1出力Isomorphic(同型)説明:Tree-2はTree-1を左右反転することで得られるため、この2つの木は同型です。解き方のアプローチこの問題は再帰的なアプローチで効率的に解くことができます。ブール型の関数を用意し、両方の木のルートノードを

  2. C++でクリシュナムルティ数かどうかを判定する方法

    クリシュナムルティ数とはクリシュナムルティ数(Krishnamurty Number)とは、各桁の数字の階乗の合計が元の数そのものと等しくなる特別な数のことです。例えば、145という数値を見てみましょう。1! + 4! + 5! = 1 + 24 + 120 = 145 となり、各桁の階乗の合計が元の数と一致します。したがって、145はクリシュナムルティ数です。この性質を持つ数は非常に珍しく、代表的な例としては 1、2、145、40585 などが挙げられます。判定アルゴリズムの考え方判定ロジックはシンプルで、以下の手順で処理を行います。対象の数値から一桁ずつ数字を取り出す取り出した数字それぞれ