迷宮問題求解(c++非遞迴程式)
一、【實驗內容】
【問題描述】
以乙個m*n的長方陣表示迷宮,0,1分別表示迷宮中的通路和障礙。設計乙個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論,
【基本要求】:首先實現乙個以煉表作儲存結構的棧型別,然後編寫乙個求解迷宮的非遞迴的程式,求得的通路以三元組(i,j,d)的形式輸出,其中(i,j)指示迷宮中的乙個座標,d表示做到下乙個座標的方向。如:對於下列資料的迷宮,輸出的一條通路為:(1,1,1),(1,2,2),(2,2,2),
(3,2,3),(3,1,2),……。
迷宮資料從檔案中讀取出來。
【測試資料】:
迷宮的測試資料如下:左上角(1,1)為入口,右下角(8,9)為出口
1 2 3 4 5 6 7 8
進0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 1
0 1 1 1 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 1
0 1 1 1 1 0 0 1
1 1 0 0 0 1 0 1
1 1 0 0 0 0 0 0 出
二、實驗目的
1、加深對棧特性理解,以便在解決實際問題中靈活運用它們
2、加深對棧操作實際演算法的理解
3、進一步熟悉掌握鍊錶的操作;
4、掌握指標的應用
5、更進一步掌握有關類的操作
三、實驗文件:
迷宮求解問題
一、 需求分析
1、本程式實現迷宮的探索過程. 以使用者和計算機對話的方式,即在計算機終端上顯示「提示資訊」之後,由使用者在鍵盤上輸入演示程式中規定的運算命令,然後程式就探索路徑並輸出路徑。
2、本演示程式中,輸入形式以「回車符」為結束標誌,且允許出現重複字元。
3、利用二維指標實現迷宮位置的儲存,並用棧存貯探索路徑,每個結點含三個整形變數。輸入的形式以回車結束。
4、本程式中,使用者可以讀去檔案裡的迷宮,也可自己重新輸入迷宮,而且使用者可以輸入任意大小的迷宮,然後程式自動探索路徑,並輸出迷宮的路徑
5、測試資料
00100010
00100010
00001101
01110010
00010000
01000101
01111001
11000101
11000000
二、概要設計
為實現上述程式功 能,應以棧儲存結點。為此,需要定義乙個抽象資料型別。
1. 抽象資料型別定義為:
adt stack
資料關係:r1=,即當前結點與下乙個結點的關係
基本操作:
stack();
建構函式,建立乙個空棧;
操作結果:通過字串a構造兩個位數不限的長整數。
void push(datatype data);
初始條件:已存在棧
操作結果:把元素data壓入棧頂
datatype pop();
初始條件:已存在棧,且非空
操作結果: 棧頂元素出棧,且刪除棧頂元素
datatype getpop();
初始條件:已存在棧,且非空
操作結果:獲取棧頂元素
void clear();
初始條件:已存在棧
操作結果:把當前的棧清空
bool isempty();
初始條件:已存在棧
操作結果:如果棧為空,則結果為「真」,否則為「假」
}adt orderedlist
2.本程式包含三個模組:
1)主程式模組:
void main()while(「命令」=」退出」)
}2)、棧模組——實現定義的抽象資料型別
3)、路徑探索模組——實現探索迷宮路徑
路徑探索模組
三、詳細設計
(下面程式中也可以把搜尋路徑作為乙個類。。。。)
程式**如下
//linklist.h檔案//
#include
#include
using namespace std;
struct datatype //定義描述迷宮中當前位置的結構型別
;struct move //定義下乙個位置的方向
;struct linknode //鍊錶結點
;//下面定義棧
class stack;
//linklist.cpp檔案
#include"linklist.h"
stack::stack() //建構函式,置空棧
stack::~stack() //析構函式*/}
void stack::push(datatype x) //把元素data壓入棧中
datatype stack::pop() //使棧頂元素出棧
}datatype stack::getpop() //取出棧頂元素
void stack::clear() //把棧清空
bool stack::isempty() //判斷棧是否為空,如果為空則返回1,否則返回0
main.cpp檔案
#include"linklist.h"
move move[4]=,,,}; //定義當前位置移動的4個方向
bool mazepath(int **maze,int m,int n);
//尋找迷宮maze中從(0,0)到(m,n)的路徑
//到則返回true,否則返回false
void printpath(stack p); //輸出迷宮的路徑
void restore(int **maze,int m,int n); //恢復迷宮
int** getmaze(int &m,int &n); //獲取迷宮(可從檔案中讀取,也可輸入)
//返回訪問迷宮的二維指標
int main()
int** getmaze(int &m,int &n)
//獲取迷宮(可從檔案中讀取,也可輸入)
//返回訪問迷宮的二維指標
if(ch=='/n')
}fip.close(); //讀取檔案結束
m=i; //得到長即行數
maze=new int *[m+2]; //申請長度等於行數加2的二級指標
for(i= 0;i='0'&&ch<='9')
//輸出路徑,包括行座標,列座標,下乙個位置方向
while(!t.isempty()) //棧非空,繼續輸出
{data=t.pop();
cout<<'('<
四、實驗總結(心得體會)
1、進一步熟悉掌握了有關棧的基本操作;
2、對迷宮有了更多的認識
4、更進一步掌握有關類的操作
5、由於對棧的演算法推敲不足,使程式除錯時費時不少
6、本程式有些**重複出現,從而減少了空間的利用率和增加了程式**的雜亂性
五、參考文獻:
1、《資料結構與演算法》 黃定 黃煜廉 劉賢興 編著
廣東科技出版社 2023年1月第1版
2、《〈資料結構與演算法〉學習與實驗指導》 黃煜廉 編著 2005. 8
3、《資料結構輔導與提高》 徐孝凱 編著
清華大學出版社 2023年12月第1版
非遞迴實現迷宮求解
迷宮求解問題 用乙個m n的矩陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對給定的迷宮,求出找到的第一條從入口到出口的通路,或得到沒有通路的結論。我們指定 迷宮的入口為矩陣的左上角 1,1 迷宮的出口為右下角 m,n 路徑的探索順序依次為 東南西北 即 右下左上 輸入 第一行輸入兩個...
歸併排序 非遞迴程式
include using namespace std left為做序列開始,right為右序列開始,step為步長,n為陣列長度 void merge int data,int left,int right,int step,int n else 開闢一塊臨時空間存放排列數 int temp ne...
非遞迴迷宮問題實現
模組化,重整程式 class lstack def init self,top 1,full 20 self.top top self.stack self.full full def is full self return self.full self.top 1 def is empty sel...