我目前被困在一個項目中。 我的目標是使用Dijkstra的算法。Java迷宮最短路徑2d int數組
我知道我從點(0,0)開始,看着起點旁邊的兩個節點,然後我移動到最小的第一個點,看看周圍的節點。我的迷宮是隨機的,但讓它容易開始讓我們說以下是我的迷宮。
我將從(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算法的視頻,我現在真的很失落。
我添加了一個數組,我把危險在它開始通過使以往節點億,但起始節點(0,0)爲0
有人可以幫助我的下一個步驟,我知道這是作業,但我沒有時間,真的需要一些指針。
UPDATE:
行,所以我把它workingish。它會打印它所需的路徑,但是如果它找到了更好的路徑,它會同時打印兩個人是否可以幫助我修復此問題
它也打破了,如果我做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行的100個位數,0-9。 (是的,10,000是很多房間,但幸運的是,我們無畏的旅行者在去年的節日禮物交換中沒有收到便攜式計算機和所有場合收集的電子數據集合,都不會離開家;它可能會重新獲得天賦。 )*
*對於此作業,您必須生成您自己的測試數據。這就是爲什麼我不去這些派對...... 輸出
程序應該將輸出寫入文件(以上述格式,包括「全部危險」輸出)。 謝謝。
UPDATE2:我發現在我的編碼錯誤我有
if(min>copy[x][y]){
min=copy[x][y];
holdx=x;
holdy=y;
}
這將使測試每一個路徑是有在給定的點我的最短路徑是更大然後是其他路徑我怎麼解決這個問題?
我錯過了什麼? 更新我完成了這個感謝非常小的幫助。
我不知道如何構建它。你能幫我從結果中構建嗎? –
從迷宮末尾開始,tentative_distance_value標籤表示到原點的最短距離。您可以通過貪婪地添加帶有標籤的節點以及從該空間移動到您的空間的成本來構建路徑。由於空間的成本與問題的邊緣無關(這是空間的危險,而不是您輸入的特定方向),因此您可以使用標籤。 – ccoakley
當我發現花費到底時,你是對的。我只是添加隔壁的小房間,並繼續前進,直到我打(0,0)。謝謝 –