994腐ったみかん
所与のグリッドでは、各セルは、3つの値のいずれかを有することができます。
値0は、空のセルを表し、
新鮮なオレンジの値1、
値が腐敗オレンジを表します。
毎分、あらゆる腐敗オレンジ(4つの方向の正)と新鮮なオレンジの腐敗に隣接しています。
オレンジのフレッシュが通過しなければならないまで、セルは分の最小数まで戻りません。可能でない場合は、-1を返します。
実施例1:
入力:[[2,1,1]、[1,1,0]、[0,1,1]]
出力:4
例2:
入力:[[2,1,1]、[0,1,1]、[1,0,1]]
出力:-1
説明:オレンジ左下隅(行2、列0)は決して腐敗腐敗はわずか4前方に行われますので。
例3:
入力します:[[0,2]]
出力:0は
説明する:ので、答えは0分であるとき、何の新鮮なオレンジがなかったので。
ヒント:
1 <= grid.length <= 10
1 <=グリッド[0] .LENGTH <= 10
グリッド[I] [J]仅为0,1或2
思考
私のアイデアや問題解決の公式テーマは幅優先探索しています。
腐敗の最小時間この被写体までの距離を記録するマトリクスを維持しながら、この距離の対応する最近腐ったオレンジの数を表現するキューを維持するための公式の方法。
しかし、私は唯一のメモリマトリックスを排除する、キューを保持ここです。
腐ったオレンジにわたって決定された差は、キュー、次INTによって位置にのみ記録層から除去されません。
最後に、非常に使いやすい、ペアでのC ++のレコードセットを頼む、Goが、行うには良い方法はありませんか?私は非常に不快に感じ道の座標を記録するためにここにいます。
私の答え
func orangesRotting(grid [][]int) int {
x:=[]int{}
y:=[]int{}
cnt,time:=0,0
for i:=0;i<len(grid);i++{
for j:=0;j<len(grid[0]);j++{
if grid[i][j]==2{
x=append(x,i)
y=append(y,j)
}else if grid[i][j]==1{
cnt=cnt+1
}
}
}
xa:=[]int{-1,1,0,0}
ya:=[]int{0,0,-1,1}
next:=len(x)
for i,xx,yy:=0,0,0;i<len(x);i++{
if i==next{
next=len(x)
time=time+1
}
for j:=0;j<4;j++{
xx=x[i]+xa[j]
yy=y[i]+ya[j]
if xx<0||xx>len(grid)-1||yy<0||yy>len(grid[0])-1||grid[xx][yy]!=1{
continue
}
marked:=false
for k:=0;k<len(x);k++{
if xx==x[k]&&yy==y[k]{
marked=true
break
}
}
if marked{
continue
}
if grid[xx][yy]==1{
cnt=cnt-1
x=append(x,xx)
y=append(y,yy)
}
}
}
if cnt==0{
return time
}
return -1
}