4月16日、私は明日、グラフの学習を開始します。過去2日間に、幅優先アルゴリズムの質問をいくつか作成しました。各質問には、いくつかの違いがあります。単一ソースの幅優先の質問と、複数ソースの幅優先の質問があります。次の質問、マルチソース幅優先アルゴリズムのアプリケーションである場合は、トピックをリストします。
これを行うには、複数の幅のソースが含まれる可能性があります。誰が最も適切なソースであるかを明確に検討する必要がありますか?この質問を分析してみましょう。最初に、各要素の最も近い0を見つけます。ソースとして1を簡単に追加し、0が見つかるまで一度に1つの円を検索できます。しかし、ソースとして1を探す場合、毎回1の値を更新する必要があるため、非常に面倒です。各0をレイヤーごとに追加する必要があります。最初の幅の優先順位は、すべての非アクションを見つけることです。 0と1(距離も1)で、1回目を2回目に追加し、レイヤー数を更新してから、2回目などとなります。以下にコードを示します。
class Solution {
public int[][] updateMatrix(int[][] matrix) {
int[][] res=new int[matrix.length][matrix[0].length];
Queue<int[]>queue=new LinkedList<>();
boolean[][] visited=new boolean[matrix.length][matrix[0].length];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==0) {
visited[i][j]=true;
queue.add(new int[]{i,j});
}
}
}
int level=0;
int[][] direction=new int[][]{
{0,1},{0,-1},{1,0},{-1,0}
};
while (!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
int[] temp=queue.poll();
res[temp[0]][temp[1]]=level;
for(int[] di:direction){
int[]newLabel=new int[2];
newLabel[0]=temp[0]+di[0];
newLabel[1]=temp[1]+di[1];
if(newLabel[0]>=matrix.length||newLabel[0]<0||newLabel[1]>=matrix[0].length||newLabel[1]<0||visited[newLabel[0]][newLabel[1]]) continue;
visited[newLabel[0]][newLabel[1]]=true;
queue.add(new int[]{newLabel[0],newLabel[1]});
}
}
level++;
}
return res;
}
}
この種の問題については、適切なソースを見つける必要があります。