結果
| 問題 |
No.2731 Two Colors
|
| コンテスト | |
| ユーザー |
kusirakusira
|
| 提出日時 | 2024-03-14 20:35:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,739 ms / 3,000 ms |
| コード長 | 1,818 bytes |
| コンパイル時間 | 287 ms |
| コンパイル使用メモリ | 82,284 KB |
| 実行使用メモリ | 137,732 KB |
| 最終ジャッジ日時 | 2024-10-03 13:26:12 |
| 合計ジャッジ時間 | 18,927 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
from heapq import *
# 入力
h,w = map(int,input().split())
A = [list(map(int,input().split())) for _ in range(h)]
# BFSで使うqueを用意
queA = [(A[0][0], 0, 0)]
heapify(queA)
colorA = [[-1 for j in range(w)]for i in range(h)]
usedA = [[-1 for j in range(w)]for i in range(h)]
usedA[0][0] = 0
queB = [(A[-1][-1], h-1, w-1)]
heapify(queB)
colorB = [[-1 for j in range(w)]for i in range(h)]
usedB = [[-1 for j in range(w)]for i in range(h)]
usedB[-1][-1] = 1
# マス(i,j)と隣接している頂点リストを返す
def nextV(i,j):
V = []
# 上
if((i == 0) == False):
V.append((A[i-1][j], i-1, j))
# 下
if((i == h-1) == False):
V.append((A[i+1][j], i+1, j))
# 左
if((j == 0) == False):
V.append((A[i][j-1], i, j-1))
# 右
if((j == w-1) == False):
V.append((A[i][j+1], i, j+1))
return V
# 色1を広げる
def f():
v = heappop(queA)
colorA[v[1]][v[2]] = 1
# 色1と色0が隣接したら出力
for nv in nextV(v[1], v[2]):
if(colorB[nv[1]][nv[2]] == 0):
print(i-1)
exit()
# 次の頂点をみる
for nv in nextV(v[1], v[2]):
if(usedA[nv[1]][nv[2]] == -1):
heappush(queA, nv)
usedA[nv[1]][nv[2]] = 0
# 色0を広げる
def g():
v = heappop(queB)
colorB[v[1]][v[2]] = 0
# 色1と色0が隣接したら出力
for nv in nextV(v[1], v[2]):
if(colorA[nv[1]][nv[2]] == 1):
print(i-1)
exit()
# 次の頂点をみる
for nv in nextV(v[1], v[2]):
if(usedB[nv[1]][nv[2]] == -1):
heappush(queB, nv)
usedB[nv[1]][nv[2]] = 0
# 愚直にシミュレーション
for i in range(h*w):
if(i%2 == 0):
f()
elif(i%2 == 1):
g()
kusirakusira