結果
| 問題 | No.2675 KUMA | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2024-03-13 20:52:39 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 262 ms / 2,000 ms | 
| コード長 | 1,588 bytes | 
| コンパイル時間 | 154 ms | 
| コンパイル使用メモリ | 82,232 KB | 
| 実行使用メモリ | 125,336 KB | 
| 最終ジャッジ日時 | 2024-09-29 23:06:03 | 
| 合計ジャッジ時間 | 6,300 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 47 | 
ソースコード
#!/usr/bin/pypy3
import sys
from collections import deque
def main():
    N = int(sys.stdin.readline())
    x = [0] * N
    y = [0] * N
    # その座標にいる UMA の集合を bit で持っておく。
    uma_set = [[0] * 1100 for _ in range(1100)]
    for i in range(N):
        x[i], y[i] = map(int, sys.stdin.readline().split())
        # 負になってバグるのを防ぐため +5 ずつしておく
        x[i] += 5
        y[i] += 5
        uma_set[x[i]][y[i]] = 1 << i
    # 設置する点の候補を列挙
    dx = [2, 1, -1, -2, -2, -1, 1, 2]
    dy = [1, 2, 2, 1, -1, -2, -2, -1]
    candidates = {(x[i] + dx[j], y[i] + dy[j]) for i in range(N) for j in range(8)}
    # UMA のいる場所を除く
    candidates -= set(zip(x, y))
    # dp
    INF = 1 << 30
    dp = [INF] * (1 << N)
    new_dp = deque([INF] * (1 << N))
    dp[0] = 0
    dx1 = [-1, -1, +2, -2]
    dy1 = [+2, -2, -1, -1]
    dx2 = [+1, +1, +2, -2]
    dy2 = [+2, -2, +1, +1]
    for a, b in candidates:
        new_dp = dp.copy()
        for bits in range(1 << N):
            if dp[bits] == INF:
                continue
            for dir in range(4):
                bits_next = bits
                # 向いた先の UMA を bits_next に加える
                bits_next |= uma_set[a + dx1[dir]][b + dy1[dir]]
                bits_next |= uma_set[a + dx2[dir]][b + dy2[dir]]
                new_dp[bits_next] = min(new_dp[bits_next], dp[bits] + 1)
            
        dp, new_dp = new_dp, dp
    print((dp[-1] if dp[-1] != INF else -1))
if __name__ == '__main__':
    main()
            
            
            
        