白駿2160画像比較


質問する


N(2≦N≦50)個の図があります.各図5×7の大きさで、2色あります.このときの2色はそれぞれ「X」と「X」です.伝えようこれらの図が与えられている場合は、2つの最も似たような図を見つけるためにプログラムを作成します.2つの図の中で異なる格の個数が最も少ない場合、2つの図が最も似ていると言います.

例えば、上記の2つの画像が与えられると、塗りの部分が異なる.上の図には5つの格が違います.これにより、異なるセルの個数が最小になる場合があります.
入力
1行目はNです.次です.×各行に7文字、各行に1枚の絵があります.
しゅつりょく
1行目に最も似た図の番号を2枚出力します.図中の番号は入力順で1、2、…、Nとなります.番号を出力するときは、小さいのを先に出力します.入力は常に1つの答えしかありません.
入力例1
3
..X....
.XXX...
.XX....
.....X.
.X...X.
...X...
..XX...
.XX....
.XX..X.
.X...X.
XX.....
X......
XX...XX
XXXX.XX
XXX..XX
サンプル出力1
1 2

解法


3 Dリストを使用します.
2 Dリストの画像をリストにします.
1枚目の図から、1枚ずつ繰り返します.
二重複文で、最初の図から繰り返します.
1番目の図と2番目の図が同じ場合(図のインデックスが同じ場合)は無視され、異なる場合は図の要素を1つずつ比較します.
比較した2枚の図の番号と他の部分の個数をリストに並べ、個別に保存します.
すべてを比較した後、このリストで他の部分の個数に基づいて最小値を検索します.
すでに比較を描いた場合、先に比較を描いて、繰り返しないので、絵の順序は昇順です.

コード#コード#

N = int(input())
pictures = []
for _ in range(N):
    picture = [list(map(str, input())) for _ in range(5)]
    pictures.append(picture)

differences = []

for i, picture_main in enumerate(pictures):
    for j, picture_comp in enumerate(pictures):
        if i != j:
            diff = 0
            for r in range(5):
                for c in range(7):
                    if picture_main[r][c] != picture_comp[r][c]:
                        diff += 1
            differences.append([i + 1, j + 1, diff])

min_difference = min(differences, key=lambda x: x[2])

print(min_difference[0], min_difference[1])
白駿2160画像比較