迷宮問題求解 C 非遞迴程式

2021-04-12 21:50:25 字數 3913 閱讀 7149

迷宮問題求解(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...