題目:假設我們有乙個7×5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。
解題思路:
需要引入兩個集合和乙個公式,如下:
具體步驟:
把起點放入openlist;
檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路;否則找出openlist中f值最小的方格作為當前方格;
找出當前方格上下左右所有可達的格仔,檢查他們是否在openlist或closelist中。如果不在,則將他們加入openlist,計算出相應的g、h、f值,並把當前格仔作為它們的「父節點」。
檢查openlist中是否含有終點格仔,如果有就結束;沒有則回到第二步。
**實現:
public
class
astarsearch,,
,,};
//每乙個格仔節點
static
class
grid
public
void
initgrid
(grid parent,grid end)
else
this
.h=math.
abs(
this
.x-end.x)
+math.
abs(
this
.y- end.y)
;this
.f=this
.g+this
.h;}
}public
static grid astarsearch
(grid start,grid end)
}//如果終點在openlist中,直接返回終點格仔
for(grid grid:openlist)}}
//openlist用盡,仍然找不到終點,說明終點不可到達,返回空
return null;
}private
static grid findmingrid
(arraylist
openlist)
}return tempgrid;
}private
static arraylist
findneighbors
(grid grid,list
openlist,list
closelist)if(
isvalidgrid
(grid.x,grid.y+
1,openlist,closelist))if
(isvalidgrid
(grid.x-
1,grid.y,openlist,closelist))if
(isvalidgrid
(grid.x+
1,grid.y,openlist,closelist)
)return gridlist;
}private
static
boolean
isvalidgrid
(int x,
int y,list
openlist,list
closelist)
//是否有障礙物
if(maze[x]
[y]==1)
//是否已經在openlistif(
containgrid
(openlist,x,y)
)//是否已經在closelist中if(
containgrid
(closelist,x,y)
)return
true;}
private
static
boolean
containgrid
(list
grids,
int x,
int y)
}return
false;}
public
static
void
main
(string[
] args)
//刪除迷宮和路徑,路徑用*表示
for(
int i=
0;i)else
} system.out.
println()
;}}}
python迷宮尋路 迷宮尋路問題 A 演算法
迷宮尋路問題 a 演算法 迷宮尋路問題是人工智慧中的有趣問題,如何表示狀態空間和搜尋路徑是尋路問題的重點,本文的主要內容是a 搜尋演算法的理解和應用,首先對基本知識和演算法思想進行了解,再通過其對迷宮問題求解應用,編寫 python 程式進行深入學習。1.搜尋區域 我們假設某個人要從 start 點...
A星尋路演算法介紹
你是否在做一款遊戲的時候想創造一些怪獸或者遊戲主角,讓它們移動到特定的位置,避開牆壁和障礙物呢?如果是的話,請看這篇教程,我們會展示如何使用a星尋路演算法來實現它!在網上已經有很多篇關於a星尋路演算法的文章,但是大部分都是提供給已經了解基本原理的高階開發者的。本篇教程將從最基本的原理講起。我們會一步...
迷宮尋路(bfs)
第一次寫部落格,希望能把基礎的演算法記錄下來,以後快要忘記了可以拿來複習。題目 輸入輸出要求 樣例 輸入樣例 8 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1...