Lv 3ロックとキー
2343 ワード
質問する
考古学者の「救命圏」は古代遺跡で秘密の扉を発見し、宝物や遺跡がたくさんあると推測した.ドアを開けてみると、ドアが特殊な形の鍵でロックされていて、ドアの前に紙があり、特殊な形の鍵でロックを解除する方法が書かれています.
ロックされたロックは、メッシュサイズが1 x 1のN x Nサイズの正方形メッシュであり、特殊な形状のキーはM x Mサイズの正方形メッシュである.
鍵には溝があり、鍵にも溝と突起があります.鍵は回転と移動が可能な構造で、鍵の回転部分が鍵の溝部分とぴったり合っていると鍵が開きます.ロック領域以外の鍵の溝と突起はロック解除に影響しないが、ロック領域内では鍵の突起とロックの溝が完全に一致し、鍵の突起とロックの突起にぶつかることができない必要がある.また、ロックのすべての溝を埋めなければなりません.そうすれば、ロックを解除できます.
パラメータにキーを表す2 D配列キーとロックを表す2 D配列ロックが与えられた場合、true(キーがロックを解除できる場合)とfalse(ロックを解除できない場合)を返すソルバを完了します.
せいげんじょうけん
keylockresult[[0, 0, 0], [1, 0, 0], [0, 1, 1]][[1, 1, 1], [1, 1, 0], [1, 0, 1]]true
I/O例説明
keyを時計回りに90度回転させ、右に1つのセルを移動させ、下に1つのセルを移動させることで、lockのすべてのメイン部分を正確に埋めることができます.
に答える
回転後、BFSでナビゲーションを行います.
コード#コード#
def rotate_right(m):
new_m = [[0]*len(m) for _ in range(len(m))]
for i in range(len(m)):
for j in range(len(m)):
new_m[j][len(m)-i-1] = m[i][j]
return new_m
def rotate_left(m):
new_m = [[0]*len(m) for _ in range(len(m))]
for i in range(len(m)):
for j in range(len(m)):
new_m[len(m)-1-j][i] = m[i][j]
return new_m
def one_eighty(m):
new_m = [[0]*len(m) for _ in range(len(m))]
for i in range(len(m)):
for j in range(len(m)):
new_m[len(m)-1-i][len(m)-1-j] = m[i][j]
return new_m
def assemble(M,m,lock):
for k in range(len(lock)):
for l in range(len(lock)):
if M[k+m][l+m] + lock[k][l] != 1:
return False
return True
def solution(key, lock):
keys = [key,rotate_left(key),one_eighty(key),rotate_right(key)]
m = len(key)-1
ml = m * 2 + len(lock)
for key in keys:
for i in range(m + len(lock)):
for j in range(m + len(lock)):
M = [[0]*ml for _ in range(ml)]
for k in range(len(key)):
for l in range(len(key)):
M[k+i][l+j] = key[k][l]
if assemble(M,m,lock):
return True
return False
Reference
この問題について(Lv 3ロックとキー), 我々は、より多くの情報をここで見つけました https://velog.io/@du-du-zi/Lv3-자물쇠와-열쇠テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol