道路のLeetCode試験(4):壁、ドア(286)

タイトルの英語版は、このです:
2Dグリッドは、これら三つの可能な値で初期化amxnあなたが与えられていることで。

-1 - 壁や障害物。

0 - ゲート。

INF - インフィニティが空の部屋を意味します。あなたがゲートまでの距離が未満2147483647塗りつぶしその最も近いゲートまでの距離に、各空室であると仮定することができるようINFを表現するために1 = 2147483647 - 私たちは、値231を使用します。それがゲートに到達することは不可能であるならば、それはINFで満たされる必要があります。

例えば、2Dグリッドを与え:

INF -1 0 INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF
あなたの関数を実行した後、2Dグリッドは次のようになります。

3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4

簡単には、中国の手段翻訳:壁が位置している-1 0ドアの位置であり、他の数値を採用することができることはできず、アルゴリズムにより2つのドアとの間の最短距離を計算します。この迷路であることを要約は、最も解決可能な問題です。

溶液:
ヒント:
1の二次元マトリックスは、二次元アレイとして見ることができる
2つのBFS(幅優先アルゴリズム)問題
思考:
これは、必要性は、2つのドアに隣接するノードをトラバースし続け、次いでスルーかどうかを決定するための最も一般的な問題BFSでありますもしポイントに隣接ノードの各トラバースのためのポイントを通過することによって継続することができる場合は、記録層が必要である(この距離は層の数である)、および各反復は、Aが横断点が必要初めて横断最短距離であるように、この点は、先に横断されているので、これらの点を回避する必要性を横断した後、収集ポイントセットは、より短い距離を使用します。

public static void wallsAndGates(int[][] a){
    //先找到0所在位置(门所在位置)
    for(int n=0;n<a.length;n++){
        for(int m=0;m<a[0].length;m++){
            if(a[n][m]==0){
                int min = bfs(a,n,m);
                //System.out.println(min);
                if(min>0){
                    System.out.println(min);
                    return;
                }
            }
        }
    }
}
//遍历从这个门到另一个门的最短距离
public static int bfs(int[][] a,int n,int m){
    Set<String> visits = new HashSet<String>();
    Queue<String> queue = new LinkedList<String>();
    queue.offer(n+""+m);
    visits.add(n+""+m);
    int count = 0;
    while(!queue.isEmpty()){
        int size = queue.size();
        for(int i=0;i<size;i++){
            String top = queue.poll();
            char[] temp = top.toCharArray();
            n = Integer.parseInt(""+temp[0]);
            m = Integer.parseInt(""+temp[1]);

//のSystem.out.println([n]は[M])。
//遍历该节点的相邻节点、如果
場合(N> 0){
int型TMP =同様にgetCount(訪問、N-1、M)。
(TMP == 1)であれば{
++数えます。
カウント数を返します。
}そうであれば(TMP == 2){
visits.add((N - 1)+ "" + m)を、
queue.add((N - 1)+ "" + M)。
}
}
もし、(N <a.length-1){
int型TMP =同様にgetCount(訪問、N + 1、M)。
(TMP == 1)であれば{
++数えます。
カウント数を返します。
}他(TMP == 2){もし
visits.add((N + 1)+ "" + M)。
queue.add((N + 1)+ "" + M)。
}
}
もし(M> 0){
int型TMP =同様にgetCount(訪問、nは、(M-1))。
(TMP == 1)であれば{
++数えます。
カウント数を返します。
}そうであれば(TMP == 2){
visits.add(N + "" +(M-1))。
queue.add(N + "" +(M - 1))。
}
}
(M <[0] .LENGTH-1){もし
INT TMP =同様にgetCount(訪問、N、M + 1)。
(TMP == 1)であれば{
++数えます。
カウント数を返します。
}そうであれば(TMP == 2){
visits.add(N + "" +(M + 1))。
queue.add(N + "" +(M + 1))。
}
}
}
++数えます。
}
-1を返します。
}

/**
 * 判断是否已访问的节点
 */
public static boolean findUsed(Set<String> visits,String visit){
    if(visits.contains(visit)){
        return true;
    }
    return false;
}

/**
 *
 */
public static int getCount(int[][] a,Set<String> visits,int n,int m){
    if(!findUsed(visits,n+""+m)) {
        visits.add(n + "" + m );
        if (a[n][m] == 0) {
            return 1;
        }else{
            return 2;
        }
    }
    return 0;
}

该方法效率不高,待优化!后续再优化更新

おすすめ

転載: www.cnblogs.com/yaphse-19/p/12029080.html