私がやっていることは、最短経路を使用して目標に到達するまでの移動回数を数えることです。幅広い最初の検索を使用して行う必要があります。私は空のためにE(これらのスポットに移動できる)、Bはブロックされている(ここでは動かない)、Rはロボット(出発点)、Gは4つの文字のうちの1つで満たされた2次元配列に入れます目標のために。アルゴリズムは、上、左、右、下の順に可動スペースがないかチェックしなければなりませんでした。ノードがチェックされた後、ノードの内容は「B」に変更されます。目標に到達できない場合は、0を返す必要があります。Javaの8x8グリッドの幅優先検索
私はKshitijが私に語ったことを実装するためにコードを変更しました。それは美しく動作します。すべての新しいデータセットの後にキューを初期化していないことを知るにはあまりにも疲れました。助けてくれてありがとう!
public static int bfSearch(){
Queue <int []> queue = new LinkedList <int []>();
int [] start = {roboty,robotx,0};
queue.add(start);
while (queue.peek() != null){
int [] array = queue.remove();
if(array[0]-1 >= 0 && grid[array[0]-1][array[1]] != 'B'){
if (grid[array[0]-1][array[1]] == 'G'){
return array[2]+1;
}
else{
grid[array[0]-1][array[1]] = 'B';
int [] temp = {array[0]-1, array[1], array[2]+1};
queue.add(temp);
}
}
if(array[1]-1 >= 0 && grid[array[0]][array[1]-1] != 'B'){
if (grid[array[0]][array[1]-1] == 'G'){
return array[2]+1;
}
else{
grid[array[0]][array[1]-1] = 'B';
int [] temp = {array[0], array[1]-1, array[2]+1};
queue.add(temp);
}
}
if(array[1]+1 <= 7 && grid[array[0]][array[1]+1] != 'B'){
if (grid[array[0]][array[1]+1] == 'G'){
return array[2]+1;
}
else{
grid[array[0]][array[1]+1] = 'B';
int [] temp = {array[0], array[1]+1, array[2]+1};
queue.add(temp);
}
}
if(array[0]+1 <= 7 && grid[array[0]+1][array[1]] != 'B'){
if (grid[array[0]+1][array[1]] == 'G'){
return array[2]+1;
}
else{
grid[array[0]+1][array[1]] = 'B';
int [] temp = {array[0]+1, array[1], array[2]+1};
queue.add(temp);
}
}
}
return 0;
}
正当な見通し、洞察力のおかげです。実行可能なパスを印刷できることは、キュー内の値として移動された方向を追加するだけで、同じ方法で動作すると仮定します。したがって、ポッピング後(1,0)、キューは{(0,2)、2、R}のようになります。本質的には、目標に達すると正しいパスを印刷することができますか? – Ethan
私は答えを編集します –
@KshitijMehtaキュー要素{(0、1)、1}には何が起こるのでしょうか?どこにポップしますか、それともキューに残っていますか? –