現在、私はプロジェクトに取り残されています。 私の目的は、ダイクストラのアルゴリズムを使用することです。Java Maze最短パス2d int配列
私はポイント(0,0)から開始することを理解しています。私は開始ポイントの隣にある2つのノードを見て、次に最小のものに移動して周囲のノードを見ます。私の迷路はランダムですが、始めるのが簡単にできるようにするには、次のことが私の迷路です。
私は(0,0)から始まり、(9,9)で終了します。数字は危険レベルであり、実際に最短ではありません。
これを設定する方法を理解するには、プッシュが必要です。 私は、私がどこにいるか、私が見たい場所を維持するためのリストやパスが必要であることを知っています。しかし、私はjavaでそれを行う方法を知らない。
import java.awt.Point;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class solver {
/**
* @param args
*/
public static int[][]maze;
public static int[][]openlist;
public static int[][]closed;
public static int[][]copy;
public static int danger;
public static int size=100;
static int Max=9;
static int Min=0;
public static List path = new ArrayList();
public static void main(String[] args) {
// TODO Auto-generated method stub
maze = new int[size][size];
openlist = new int[size][size];
closed = new int[size][size];
copy = new int[size][size];
filler(maze);
copy=dijstkra();
printer(maze);
//printer(copy);
EDSfAO(maze,0,0);
printer(openlist);
printer(copy);
}
private static Boolean notwall(int i, int j){
if((i>maze.length-1)||(j>maze.length-1)||(i<0)||(j<0))
{return false;}
return true;}
private static int[][] dijstkra(){
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze.length;j++){
copy[i][j]=100000000;
}}
copy[0][0]=0;
return copy;
}
private static void EDSfAO(int[][] maze,int i,int j){
int min=100000000;
int holdx = 0;
int holdy = 0;
openlist[i][j]=1;
danger=copy[i][j];
if(i==maze.length-1&&j==maze.length-1){
printer(copy);
for(holdx=0;holdx<path.size();holdx++){
System.out.print(path.get(holdx));
}
}
else{
if(notwall(i+1,j)&&openlist[i+1][j]!=1){
copy[i+1][j]=danger+maze[i+1][j];
} if(notwall(i,j+1)&&openlist[i][j+1]!=1){
copy[i][j+1]=danger+maze[i][j+1];
} if(notwall(i,j-1)&&openlist[i][j-1]!=1){
copy[i][j-1]=danger+maze[i][j-1];
} if(notwall(i-1,j)&&openlist[i-1][j]!=1){
copy[i-1][j]=danger+maze[i-1][j];
}
for(int x=0;x<maze.length;x++){
for(int y=0;y<maze.length;y++){
if(openlist[x][y]!=1){
if(min>copy[x][y]){
min=copy[x][y];
holdx=x;
holdy=y;
}
}
}}
moveToPosition(holdx,holdy);
}
}
private static void moveToPosition(int x, int y) {
openlist[x][y]=1;
path.add("("+x+","+y+")");
openlist[x][y]=1;
EDSfAO(maze,x,y);
}
private static void printer(int[][] maze) {
// TODO Auto-generated method stub
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze.length;j++){
System.out.print("["+maze[i][j]+"]");
}
System.out.println();
}
}
public static void filler(int[][] maze){
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze.length;j++){
//If i=0 AND j=0 then maze[0][0]= 0(start) OR i= maze.length-1 AND j= maze.length-1 then maze[maze.length][maze.length]=0
if((i==0 && j==0) || (i==maze.length-1 && j==maze.length-1)){
maze[i][j]=0;
}else{
maze[i][j]=Min + (int)(Math.random() * ((Max - Min) + 1));
}
}
}
}
}
迷路は壁なしで接続され、すべてのボックスは部屋です。 私はこれについて時間をかけて作業しようとしており、実際にプッシュを使用することができます。 私はdijstkraのアルゴリズムについて多くのビデオを見てきましたが、今は本当に失われています。
私はそれで危険を保つ配列がこれまでに100000000をノード行うことで起動しますが、開始ノード(0,0)が0
で追加誰かが、私はそれが宿題だ理解し、次のステップで私を助けることができるが、私は時間がなくなり、実際にいくつかの指針が必要です。
更新日:
よろしくお願いいたします。それはパスを印刷しますが、より良いパスが見つかった場合は両方を印刷して、誰かがこれを解決するのを助けることができます。
もし私が100X100の要素をしたら、誰かが私にその理由を教えてくれるのですか? これは本当の "プログラミング課題"の最後です。期待どおり、これにはグラフが含まれます(ひねりあり)。もちろん、問題解決にもいくつかの問題があります。 命令
は、すべての部屋が正方形の環境にして完璧なグリッドに配置されている「ダンジョンゲーム」を想像してみてください。各部屋には0(無害)〜9(回避は慎重になる)の範囲のある程度の危険を呈するクリーチャーがあります。目的は、ダンジョンを通じた最初から最後までの経路を見つけ、危険の全体的な量を最小限に抑えることです。
境界にある場合を除き、各部屋は上下左右の方向にのみ存在します(対角線なし)。入り口は左上(0,0)にあり、出口は右下(n-1、n-1)にあります。
最初から最後まで、部屋の座標のパスの形で移動しなければならないすべての「部屋」をリストします。例えば
:
(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (3、 3) (4,3) (4,4)
合計危険= 11 入力
入力ファイル100桁、0-9の100行からなります。 (はい、10,000部屋がたくさんあることですが、幸運にも、私たちの勇敢な旅行者は、すべての行事のために、携帯型コンピュータや電子データ・セットの集合せずに家を離れることはありません昨年のクリスマスプレゼント交換で受信し、それはおそらく、再才能ました。 )*
*この割り当てのために、独自のテストデータを生成する必要があります。これが私がこの種のパーティーに行かない理由です... 出力
プログラムは出力をファイルに書き込む必要があります(前述の "危険度"の出力を含む)。おかげさまで
アップデート2:私は私の私はこれはそれが私の最短経路は、私はこの問題を解決しますどのように他のパスその後、大きい与えられた点であり、すべてのパスをテストするようになります
if(min>copy[x][y]){
min=copy[x][y];
holdx=x;
holdy=y;
}
を持つコーディングでエラーを検出しました?
私は私が何をしないのですか? 更新非常に軽いヘルプでこの感謝を終えました。
私はそれをどのように構築するかわかりません。あなたは私が結果からそれを構築するのを助けることができますか? –
迷路の終わりから始まり、tentative_distance_valueラベルは、原点までの最短距離を表します。そのスペースからあなたのスペースに移動するコストとラベルを加えたノードを貪欲に追加することで、パスを構築することができます。スペースのコストは問題のエッジから独立しているので(スペースの危険で、入力した特定の方向ではありません)、ラベルを使用することができます。 – ccoakley
私は最後まで辿り着くためのコストを見つけた直後です。私はちょうど隣のスマラートルームを追加し、私が(0,0)を打つまでずっと続けています。ありがとう –