????上篇文章寫出了利用函數形成棧楨的特性完成迷宮求解問題, 本篇文章我們自己手動維護一個棧, 其進行出棧, 入棧, 取棧頂元素, 來完成迷宮求解尋路的過程
????思路和以前一樣, 首先, 我們先定義一個棧, 對其初始化, 同時, 定義一個迷宮地圖, 對該地圖進行初始化, 先判斷當前位置是否可以落腳, 如果不能落腳就直接 return, 如果能夠落腳, 就將入棧同時將其標記, 標記完之后就循環取棧頂元素, 直到取棧頂元素失敗時回溯, 每取一個棧頂元素就判斷一下該棧頂元素是否是出口, 如果是出口, 就說明迷宮探測完畢, 如果不是出口,就按順序(順時針)探測該點四周的點, 判斷該位置是否可以落腳, 能落腳就將其標記, 然后將其入棧,然后進入下以次循環, 如果四周的點都探測完畢, 此時就可以回溯了(出棧)
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);//判斷當前是否可以落腳}
}