件名の説明:
彼の投稿:
クラスソリューション: DEF minPushBox(自己、グリッド:リスト[リスト[STR]]) - > INT: driction = [(0,1)、(0、-1)、( - 1,0)、(1 、0) ] のための I における範囲(LEN(グリッド)) のために、J における範囲(LEN(グリッド[0])): もしグリッド[I] [J] == " B " : ボックス = (i、j)の 場合グリッド[ I] [J] == " S " : グリッド[I] [J] = " " 開始= (i、j)の 場合グリッド[I] [J] == " T " : グリッド[I] [J] = " " ターゲット = (i、j)はデフDFS(開始、終了、訪問): 訪れました。 (開始)を追加した場合に開始== :終了 戻り真 ため I_、J_ でdriction: I、J = [1] +起動、[0] + I_を開始J_の 場合 <= I <lenの(グリッド)0 及び 0 <= J <lenの(グリッド[0])と (グリッド[I] [J] == " " / 又はグリッド[I] [J] == " B ")と(i、j)はしないで訪問およびDFS((i、j)は、端部、訪問) : リターン真の リターン偽が 訪れた = セット() キュー = [] queue.append((ボックス[0]、ボックスの[ 1]、[1スタート、[0]を起動])) visited.add((ボックス[0]、ボックス[ 1]、起動[0]、起動[1 ])) RES = -1 一方 TMP
キュー:= [] RES + = 1 用の I、J、X、Y におけるキュー: もしターゲット== (I、J): 戻りRES 場合、0 <= J-1 <J + 1 <lenの(グリッド[0])とグリッド[I] [J-1] =!" #" とグリッド[I] [J + 1] =!" #" : もし(I、J-1、i、j)はない で訪問し、 DFS((X 、Y)、(I、J + 1 )、{(i、j)は}): visited.add((I、J -1、I、J)) tmp.append((I、J -1 、i、j)の) 場合(I、J + 1、i、j)はしない で訪問および DFS((x、y)は、(I、J -1 )、{(i、j)は}): visited.add((I、J +1 、i、j)は) tmp.append((I、J +1 、I、J)) であれば、0 <I = -1 <I + 1 <lenは(グリッド)とグリッド[I-1] [J] =!" #" とグリッド[I + 1] [J] =!" #" : もし(I-1、J、 i、j)がない に訪問し、DFS((x、y)は、(I + 1 、j)は、{(i、j)は}): visited.add((I -1 、J、I、J)) tmp.append((I -1 、 J、I、J)) であれば(I + 1、J、I、J)しない で訪問および DFS((X、Y)、(I-1 、j)は、{(i、j)は}): 訪れました。追加((I 1 、J、I、J)) tmp.append((I 1 、J、I、J)) キュー = tmpの リターン -1
最適化:*
クラスソリューション: DEF minPushBox(自己、グリッド:リスト[リスト[STR]]) - > INT: N、M = LEN(グリッド)、lenの(グリッド[0]) のための I におけるレンジ(N) のための J で範囲(M): もしグリッド[I] [J] == ' T ' : T = (i、j)は ELIFグリッド[I] [J] == ' S ' : S = (I、J) ELIFグリッド[I ] [J] == ' B ': B = (i、j)は DIRS = [1,0]、[-1,0]、[0、1]、[0、-1 ] Q = [タプル(S + B)] 見 = セット( Q) ステップ = 0 ながらQ: NQ = [] のための SI、SJ、BI、BJ におけるQ: もし T ==(BI、BJ):戻り工程 のためにディ、DJ でDIRS: NSI、NSJ = SI +ジSJ + DJ 場合==人口を毒殺し、 NSJ == BJ: 待ち伏せ、NBJ = +、BJ + DJ DS = 1 他: 待ち伏せ、NBJ = 人口、BJ DS = 0 の場合 ではない(0 <=毒<N と 0 <= NSJ <M):続行 なら ない(0 <=待ち伏せ<N 及び 0 <= NBJ <M):続行 する場合グリッド[毒] [NSJ] == ' #' またはグリッド[待ち伏せ] [NBJ] == '#":継続 NSB = (NSI、NSJ、NBI、NBJ) 場合 NSB で見ては:続ける (NSB)seen.add かの DS == 0: q.append(NSB) 他: nq.append(NSB) Q = NQ 手順 + = 1つの リターン -1