leetcode-163周のゲーム倉庫番* -1263-

件名の説明:

 

 

 

 

 

 

 

彼の投稿:

クラスソリューション:
     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

 

 

おすすめ

転載: www.cnblogs.com/oldby/p/11901323.html