[BOJ]ジャンプゲーム(no.1558)
質問する
尚根はゲームを作り、右図に示す地図で行います.
地図は2行に分かれており、各行はN個の格子に分かれている.格子は危険格子と安全格子に分けられ、安全格子はプレイヤーが移動できる格子であり、危険格子は移動できない格子である.
最初は、プレイヤーは左の列の1号車の上に立って、毎秒以下の3つの行為の1つをします.
1つ前に移動します.たとえば、現在のセルがi番の場合、i+1番のセルに移動します.
1つ後ろに移動します.たとえば、現在のセルがi番の場合、i-1番のセルに移動します.
向こうのロープに飛び込む.このとき,元のセルよりk個前のセルに移動する.たとえば、現在のセルが左行のi番セルの場合、右行のi+k番セルに移動する必要があります.
N号車よりも大きな車両に移動すれば、ゲームは完了です.
ゲームをおもしろくするために、尚根は毎秒1コマを消す機能を作った.すなわち、ゲーム開始1秒後には1号車が消え、2秒後には2号車が消える.勝手にプレイヤーが先に移動し、格子が消えると仮定します.つまり、今回消えるのは3号車で、尚根が3号車で、3号車から別の車両に移動すると、3号車は消えてしまいます.
各欄の情報が提供される場合は、ゲームをクリアできるかどうかを判断するプログラムを作成します.
入力
第1行はNとKを与える.(1 ≤ N, k ≤ 100,000)
2行目には、左の行の情報が表示されます.i最初の文字が0の場合は危険なスペース、1の場合は安全なスペースです.3行目は右の行の情報を与え、各文字の意味は左の行の意味と同じである.
左の列の1号車はいつも安全です.
しゅつりょく
ゲームがクリアできたら出力1、なければ出力0.
🤔 の意見を打診
これは比較的条件の多いbfs問題である.
0と1からなるので、
비트마스킹
で解くのは簡単かもしれませんが、演算量が大きすぎるため、通常のTrue False配列で扱うことにしました.i-1,i+1,i+kの場合は,アクセス配列検査とともにnが超えると停止することを提示する.
中間インデックスがあまりにも葛藤して、髪の毛を少しつかんだ.
📌 説明する
import sys
input = sys.stdin.readline
def main():
n,k = map(int, input().split())
q = [(0,0)]
dirs = [input(), input()]
cache = [[False]*n for _ in range(2)]
rm = 0
while q:
tmp = []
for i,d in q:
if i+1 >=n or i+k >= n:
print(1)
sys.exit()
if dirs[d][i+1] == '1' and not cache[d][i+1]:
cache[d][i+1] = True
tmp.append((i+1,d))
if i-1 > rm and dirs[d][i-1] == '1' and not cache[d][i-1]:
cache[d][i-1] = True
tmp.append((i-1,d))
if dirs[1-d][i+k] == '1' and not cache[1-d][i+k]:
cache[1-d][i+k] = True
tmp.append((i+k,1-d))
rm += 1
q = tmp
print(0)
if __name__ == "__main__":
sys.exit(main())
レビュー
Reference
この問題について([BOJ]ジャンプゲーム(no.1558)), 我々は、より多くの情報をここで見つけました https://velog.io/@wisepine/BOJ-점프-게임-no.15558テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol