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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

栈的应用——迷宫的非递归解法

發布時間:2025/7/14 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈的应用——迷宫的非递归解法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
迷宮的求解是一個經典的問題,一直以來都想自己動手寫寫,雖然網上有無數的代碼,雖然對算法比較清楚,但我覺得只有在不參考任何資料的情況下,能寫的出來才算是真正掌握。今天有時間,有心情,終于靜下心來寫完了這個程序。盡管代碼很短,可還是花了兩個多小時,發現自己動手能力太差了。
????????下面是源碼:
#include?<iostream>
#include?
<stack>
#include?
<list>
#include?
<assert.h>
#include?
<fstream>

using?namespace?std;

struct?Position{??//定義位置結構體
????int?r;
????
int?c;
};

bool?FindPath(Position?start,Position?end,stack<Position>&?pos,int?**maze)
{
????Position?current?
=?start;

????
//定義探尋的四個方向
????Position?offset[4];
????offset[
0].r=-1;?offset[0].c=0;???//up
????offset[1].r=0;??offset[1].c=1;???//right
????offset[2].r=1;??offset[2].c=0;???//down
????offset[3].r=0;??offset[3].c=-1;??//left

????
int?di=0;
????
int?lastDi=3;
????
int?row,col;

????
while(current.c!=end.c?||?current.r!=end.r)//沒有找到出口
????{
????????
while(di<=lastDi)???//從當前位置按順時針順序探尋
????????{
????????????row?
=?current.r+offset[di].r;
????????????col?
=?current.c+offset[di].c;
????????????
if?(maze[row][col]?==?0)//下一個位置可行
????????????{
????????????????
break;
????????????}
????????????di
++;
????????}
????????
//find?a?througth?path
????????if?(di?<=?lastDi)//找到下一個可行的位置
????????{
????????????pos.push(current);
//將當前位置入棧
????????????current.r?=?row;
????????????current.c?
=?col;
????????????maze[row][col]?
=?1;//標記當前位置為不可通過,以免陷入死循環
????????????di?=?0;
????????}
????????
else//沒有找到相鄰的通行線路
????????{
????????????
if?(pos.empty())//沒有找到通路
????????????{
????????????????
return?false;
????????????}
????????????Position?next;
????????????next
=?pos.top();
????????????pos.pop();
????????????
if?(next.c?=?current.c)//取得當前應探尋的方向
????????????{
????????????????
if?(?next.r>current.r?)
????????????????{
????????????????????di?
=?1;
????????????????}
????????????????
else
????????????????????di?
=?3;
????????????}
????????????
else?if?(next.r?=?current.r)
????????????{
????????????????di?
=?3?+?next.c-current.c;
????????????}
????????????current?
=?next;//標記當前位置為棧頂位置
????????}

????}
????pos.push(end);
//將出口入棧

????
return?true;
}

int?main()
{
????ifstream?
in("maze.dat");//定義迷宮文件
????assert(in);????
????
????
int?row,col;
????
int?i,j;

????
in>>row>>col;//讀入迷宮的行和列

????
//定義迷宮數組,迷宮四周加墻,以使迷宮邊界與內部節點同等處理
????int?**maze=new?int*[row+2];
????
for?(i=0;?i<row+2;?i++)
????{
????????maze[i]?
=new?int[col+2];
????}
????
????
for?(i=0;i<row+2;i++)//迷宮四周為墻,設置為不可通過
????{
????????maze[i][
0]?=?maze[i][col+1]?=?1;
????}
????
for?(j=0;j<col+2;j++)
????{
????????maze[
0][j]?=?maze[row+1][j]?=?1;
????}

????Position?start,end;
????
in>>i>>j;???//讀入入口位置
????start.r=i;?start.c=j;
????
in>>i>>j;???//讀入出口位置
????end.r=i;?end.c=j;

????
//讀入迷宮數據
????for?(i=1;i<row+1;i++)
????{
????????
for?(j=1;j<col+1;j++)
????????{
????????????
in>>maze[i][j];
????????}
????}

????stack
<Position>?path;
????list
<Position>?show;
????
if?(FindPath(start,end,path,maze))//找到一條路徑
????{
????????
while?(!path.empty())
????????{
????????????show.push_front(path.top());
//路徑出棧
????????????path.pop();
????????}

????????list
<Position>::iterator?it=show.begin();
????????
for?(;?it!=show.end();?it++)//顯示路徑
????????{
????????????cout
<<"("<<(*it).r<<"?,?"<<(*it).c<<")"<<endl;
????????}
????}
????
else//沒有找到路徑
????{
????????cout
<<"Not?find?any?correct?path!"<<endl;
????}

????
for?(i=0;?i<row+2;?i++)//釋放內存空間
????{
????????delete?[]maze[i];
????}
????delete?[]maze;

????
return?0;
}


????其中的文件結構為:第一行,迷宮的行(ROW)和列(COL)
????????????????????????????第二行,迷宮的入口
????????????????????????????第三行,迷宮的出口
????????????????????????????第四行以后,迷宮數據,按行存儲,每行COL個0或1,共ROW行
????文件中數據以空格或回車或table隔開。不能含有其它字符。因為未對數據進行檢驗,故無法識別數據結構錯誤。

????這是一個迷宮文件: maze.dat,因為上傳不支持.dat,所以需要將.txt后綴改為.dat。

轉載于:https://www.cnblogs.com/chengy024/archive/2008/07/02/1234181.html

總結

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

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