日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迷宫求解(非递归)

發(fā)布時間:2023/11/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迷宫求解(非递归) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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;//非法輸入}//創(chuàng)建棧, 并且初始化, 保存走過的路徑SeqStack stack;SeqStackInit(&stack);//判斷入口點是否可以落腳, 能落腳就將其入棧if(!CanStay(maze, entry)){return;}SeqStackPush(&stack, entry);//循環(huán)獲取當前棧的棧頂元素, (棧頂元素一定可以落腳)棧為空時回溯結束//判斷是否為出口, 是的話就退出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);//按順序取相鄰元素判斷是否可以落腳, 能落腳就標記入棧, 進入下一輪循環(huán)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);//判斷當前是否可以落腳} }

總結

以上是生活随笔為你收集整理的迷宫求解(非递归)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。