生活随笔
收集整理的這篇文章主要介紹了
迷宫求解(非递归)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
????上篇文章寫(xiě)出了利用函數(shù)形成棧楨的特性完成迷宮求解問(wèn)題, 本篇文章我們自己手動(dòng)維護(hù)一個(gè)棧, 其進(jìn)行出棧, 入棧, 取棧頂元素, 來(lái)完成迷宮求解尋路的過(guò)程
????思路和以前一樣, 首先, 我們先定義一個(gè)棧, 對(duì)其初始化, 同時(shí), 定義一個(gè)迷宮地圖, 對(duì)該地圖進(jìn)行初始化, 先判斷當(dāng)前位置是否可以落腳, 如果不能落腳就直接 return, 如果能夠落腳, 就將入棧同時(shí)將其標(biāo)記, 標(biāo)記完之后就循環(huán)取棧頂元素, 直到取棧頂元素失敗時(shí)回溯, 每取一個(gè)棧頂元素就判斷一下該棧頂元素是否是出口, 如果是出口, 就說(shuō)明迷宮探測(cè)完畢, 如果不是出口,就按順序(順時(shí)針)探測(cè)該點(diǎn)四周的點(diǎn), 判斷該位置是否可以落腳, 能落腳就將其標(biāo)記, 然后將其入棧,然后進(jìn)入下以次循環(huán), 如果四周的點(diǎn)都探測(cè)完畢, 此時(shí)就可以回溯了(出棧)
void GetPathByLoop(Maze* maze, Point entry)
{
if(maze == NULL){
return;}
if(entry.row <
0 || entry.row >= MAX_ROW || entry.col <
0 || entry.col >= MAX_COL){
return;}SeqStack
stack;SeqStackInit(&
stack);
if(!CanStay(maze, entry)){
return;}SeqStackPush(&
stack, entry);
while(
1){Point cur;
int ret = SeqStackGetFront(&
stack, &cur);
if(ret ==
0){
return;}
if(IsExit(maze, cur, entry)){
printf(
"找到了一條路\n");
return;}
printf(
"(%d, %d)\n", cur.row, cur.col);Point up = cur;up.row -=
1;
if(CanStay(maze, up)){Mark(maze, up);SeqStackPush(&
stack, up);
continue;}Point right = cur;right.col +=
1;
if(CanStay(maze, right)){Mark(maze, right);SeqStackPush(&
stack, right);
continue;}Point down = cur;down.row +=
1;
if(CanStay(maze, down)){Mark(maze, down);SeqStackPush(&
stack, down);
continue;}Point left = cur;left.col -=
1;
if(CanStay(maze, left)){Mark(maze, left);SeqStackPush(&
stack, left);
continue;}SeqStackPop(&
stack);}
}
總結(jié)
以上是生活随笔為你收集整理的迷宫求解(非递归)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。