幅優先ウェイファインディングのJavaバージョン(BFS +互いに素セットのアイデア)

輸入java.util.Deque。
輸入java.util.LinkedList; 


クラスノード{
     int型のX。
    int型のyを。
} 

クラスソリューション{
     プライベート INT DIR [] [] = 新しい INT [] [] {{0、-1}、{ - 1,0}、{0,1}、{1,0 }}。
    プライベートノードparentx [] [];
    プライベート int型のカウント[] [];
    プライベート ブールは、[] []を使用しました。
    プライベートノード開始= 新しいノード();
    プライベートノード終了= 新しいノード();
    民間のDeque <ノード>キュー= 新しいですLinkedListの<ノード> ();
    プライベートノードの一時。
    プライベート ブールフラグ= ;
    パブリック ブールisCheckMove(文字列[]地図、ノード開始){
         戻り start.x> = 0 && start.x <map.length && start.y> = 0 && start.y < マップ[start.x] .LENGTH()。
    } 
    パブリック ブールprintPath(文字列[]地図){
         一方(parentx [temp.x] [temp.y] .X!= temp.x || parentx [temp.x] [temp.y] .Y!= TEMP。 Y){ 
            System.out.printは([temp.x] .charAt(temp.y MAP) + " - "を" )。
            TEMP = parentx [temp.x] [temp.y]。         
        System.out.println([temp.x] .charAt(temp.y)をMAP); 
        返す ; 
    } 
    公共 INT DFS(文字列[]地図、ノード開始){ 
        
        queue.offer(スタート)。
        使用[start.x] [start.y] = 
        カウント[start.x] [start.y] = 1 
        
        ながら(!queue.isEmpty()){ 
            開始 = )(queue.pop。
            以下のためにint型 i = 0; ++; iは、4 < I){ 
                TEMP = 新しい)(ノード; 
                temp.x = start.x + DIR [I] [0 ]。
                temp.y= start.y + DIR [I] [1 ]。
                 もし(temp.x == end.x && temp.y == end.y){ 
                     フラグ = 
                     queue.addLast(TEMP)。
                     parentx [temp.x] [temp.y] = 始めます。
                     カウント[temp.x] [temp.y] =カウント[start.x] [start.y] +1 
                     使用[temp.x] [temp.y] = 破ります; 
                } 
                場合(!isCheckMove(マップ、TEMP)は&& 使用[temp.x] [temp.y]){  
                     queue.addLast(TEMP)。
                     parentx [temp.x] [temp.y] = 始めます。
                     カウント[temp.x] [temp.y] =カウント[start.x] [start.y] +1 
                     使用[temp.x] [temp.y] = 
                } 
            } 
            もし(フラグ){
                 ブレーク
            } 
        } 
        戻り[temp.x] [temp.y]カウント。
    } 
    
    パブリック ブールNUMS(文字列マップ[]){ 
        queue.clear()。
        parentx = 新しいノード[map.length] [地図[0 ] .LENGTH()]。
        カウント = 新しい INT [map.length]を[マップ[0 ] .LENGTH()]。
        中古= 新しい ブール [map.length] [地図[0 ] .LENGTH()]。
        int型 ; iがmap.lengthを<++ iが0 = {i)が
             ためINT J = 0; jは<[I] .LENGTH()マップ; ++ J){ 
                使用[I] [J] = ; 
                [i] [j]はカウント = 0 ; 
                ノードTMP = 新しいノード()。
                tmp.x = I; 
                tmp.y = J; 
                parentx [I] [J] = TMP。
                もし(マップ[i]が.charAt(J)== '#' ){
                    end.x = I; 
                    end.y = J; 
                } 
                もし(マップ[i]が.charAt(J)== '@' ){ 
                    start.x = I。
                    start.y = J; 
                } 
            } 
        } 
        のSystem.out.println(DFS(マップ、開始))。
        printPath(マップ)
        返す ; 
    } 
} 


パブリック クラスまず{
      公共 静的 ボイドメイン(文字列[]引数){ 
      解空間 = 新しいですソリューション(); 
      文字列マップ[] = { "****"、 "@ ***"、 "&&&&"、 "&&&&"、 "&#**" }。
      space.nums(マップ)
      (文字列str:マップ){ 
            のSystem.out.println(STR)。
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/z2529827226/p/11620972.html