【競プロ】過去問精選100問「JOI 2008 予選 4 - 星座探し」解法
Free-PhotosによるPixabayからの画像

はじめに

このシリーズではレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】でまとめられている100問をPythonで解いています。

問題

JOI 2008 予選 4 - 星座探し

ポイント

全探索で解いていきます。

①1枚目の写真(探したい星座)の中で、最も左にある星を確認する。

②2枚目の写真(星空)の中にある星の中から1つ選び、この星が①で求めた星だと仮定した際の、

 ①と②の平行移動の距離を求める。

③ 1枚目の写真(探したい星座)の他の星に関して、それぞれ同じ平行移動を行った場所に2枚目の中で星が存在するかを確認する。星座を構成する星が全てあればOK, 1つでも無ければNGなので②で違う星を選ぶ。

コード

def main():
    target_sign = []
    stars = []

    # 1枚目の写真(探したい星座)の取得
    M = int(input())
    for _ in range(M):
        x, y = map(int, input().split(" "))
        target_sign.append([x,y])

    # 2枚目の写真(星空)の取得
    N = int(input())
    for _ in range(N):
        x, y = map(int, input().split(" "))
        stars.append([x,y])

    # 左から並ぶ様にソートする
    target_sign.sort(key=lambda x: x[0])
    stars.sort(key=lambda x: x[0])

    # 平行移動の距離を計算する(ポイントの①,②の部分)
    for i in range(len(stars)):
        distance_x = stars[i][0] - target_sign[0][0]
        distance_y = stars[i][1] - target_sign[0][1]

    # 他の星を平行移動した位置に星が存在するかを確認する(ポイントの③の部分)
        for j in range(1, len(target_sign)):
            tmp = [target_sign[j][0] + distance_x, target_sign[j][1] + distance_y]
            if tmp not in stars:
                break
        else:  # for loopがbreakしなければ平行移動した距離を出力
            print(distance_x, distance_y)

if __name__ == '__main__':
    main()
おすすめの記事