地図 - マルチソースBFS

0x01の。問題

これで、サイズNの手がNの「マップ」(グリッドを)×持っているgrid各「エリア」(セル)の上で使用されている、01良いとラベル。これは0、海を表し1た土地に代わって、あなたは遠いそれが1陸域から海域を知っていますか?最寄りの陸域から海へのエリアをご返送ください。
ここでは、距離「マンハッタン距離」(マンハッタン距離)の話している:(x0, y0)(x1, y1)二つの領域の間の距離です|x0 - x1| + |y0 - y1|
私たちは、海や陸地をマッピングした場合のみ、ご返送ください-1

ヒント:1 <= grid.length == grid[0].length <= 100 grid[i][j] 不是 0 就是 1

入力例:[[1,0,1]、[0,0,0]、[1,0,1]]
出力例:2
説明:海域(1、1)との間の距離とすべてのランド領域最大、2の最大距離。

注:この質問はLeetcodeから来ています

C++函数形式:    int maxDistance(vector<vector<int>>& grid) 

0×02。簡単な分析

タイトルを読んで、明確にタイトルいくつかの重要な意味:

  • 探して離れた最寄りの陸地から、陸と海のエリアから遠いです。
  • 工程数の別の点に一点から来る理解されるように、マンハッタン距離は、距離です。

両方が遠いを伴うため、我々は確かに、いつものように、最も遠いを検索し、最寄りのを見つけるために行ったことはできませんので、同じ遠い複数が、最近のみ可能があるかもしれないので、それはとても正常とされ、最近は含ま確かに、検索ではありません。

我々は、最も近い距離のそれぞれに土地の海を見つけた場合、思考、逆の考え方を変更し、最大内部を取ることができ、我々は最初のアイデアを持っているので、条件が満たされていません。

  • トラバーサルgrid、限り出会いは海を検索するために行ってきましたよう。
  • 最も近い陸地からフィルムオーシャンを検索し、復帰条件はその限り、検索処理に遭遇した土地は、それはそれが最短距離、ステップ数、遭遇した土地を記録するときに検索するたびにされた手段として、単にライン上のステップ数を返すですA。
  • 最後に、最も近い陸地の最大距離からすべての海を取ります。

思考のこのラインは最高のこの問題を解決することはできませんが、我々は解決するために、マルチソースBFSの使用を考慮することができます。

マルチソースBFSが唯一の源ではない、実際には、原理は同じですが、より高い効率とでより多くのです。

トラバースに同時に複数のポイントは、実際には、この距離のタイトルは、私たちが横断を終わる回数の最大値です。

  • まで行きためのステップの数、トラバースされ、海を通過する最後の時間が離れた土地から最も遠い各移動1スペースの端にすべての土地を、そして最終的に横断されて、それはすべての海の上にする必要があります:説明陸上移動体が海に、このトラバースにのみ非常に多くの時間があるので、トラバースするためにトラバースの数は、土地のこの部分海洋への最短距離です。

当社の全体的なアイデアはこれです:

  • すべての最初のチームに土地。
  • ans'第1のランドが横断しているため横断レコードの数初期-1、それがゼロでなければなりません。
  • すべての海まではリターンを横断ans

。コードを解決0X03 - 普通BFS

class Solution {
public:
    int dx[4] = { 0, 0, 1, -1 };
    int dy[4] = { 1, -1, 0, 0 };   
    struct goStep{
        int x;
        int y;
        int step;
    };
    int findMin(vector<vector<int>>& grid,int x,int y){
        bool visited[101][101];
        memset(visited, 0, sizeof visited);
        queue<goStep> queue;
        queue.push({x,y,0});
        visited[x][y]=true;
        while(!queue.empty()){
            auto p=queue.front();
            queue.pop();
            for(int i=0;i<4;i++){
                int next_x=p.x+dx[i];
                int next_y=p.y+dy[i];
                if(next_x<0||next_y<0||next_x==grid.size()||next_y==grid.size()) continue;
                if(visited[next_x][next_y]) continue;
                queue.push({next_x,next_y,p.step+1});
                visited[next_x][next_y]=true;
                if(grid[next_x][next_y]==1) return p.step+1;
            }

        }
        return -1;
    }
    int maxDistance(vector<vector<int>>& grid) {
        int ans=-1;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid.size();j++){
                if(grid[i][j]==0) ans=max(ans,findMin(grid,i,j));
            }
        }
        return ans;
    }
};

。コードを解決0x04を - マルチソースBFS

class Solution {
public:
    int dx[4] = { 0, 0, 1, -1 };
    int dy[4] = { 1, -1, 0, 0 };   
    struct goStep{
        int x;
        int y;
    };

    int maxDistance(vector<vector<int>>& grid) {
        int n=grid.size();
        queue<goStep> queue;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==1) queue.push({i,j});
            }
        }
        if(queue.size()==0||queue.size()==n*n) return -1;
        int ans=-1;
        while(!queue.empty()){
            ans++;
            int k=queue.size();
            while(k--){
                auto p=queue.front();queue.pop();
                for(int i=0;i<4;i++){
                    int next_x=p.x+dx[i];
                    int next_y=p.y+dy[i];
                    if(next_x<0||next_y<0||next_x==n||next_y==n) continue;
                    if(grid[next_x][next_y]!=0) continue;
                    grid[next_x][next_y]=-1;//沉岛效应
                    queue.push({next_x,next_y});
                }
            }
        }
        return ans;
    }
};

  • 実際には、両者の間の非常に大きなギャップ!
  • 時間と空間では、マルチソースBFS方法は、回数に優れています!

ATFWUS --Writingにより、2020年3月29日

公開された163元の記事 ウォンの賞賛184 ・は 10000 +を見て

おすすめ

転載: blog.csdn.net/ATFWUS/article/details/105184960