結果
問題 | 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/pypy3import sysfrom collections import dequedef main():N = int(sys.stdin.readline())x = [0] * Ny = [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] += 5y[i] += 5uma_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))# dpINF = 1 << 30dp = [INF] * (1 << N)new_dp = deque([INF] * (1 << N))dp[0] = 0dx1 = [-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:continuefor 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, dpprint((dp[-1] if dp[-1] != INF else -1))if __name__ == '__main__':main()