迷宮問題 資料結構實驗報告

2021-08-09 21:55:17 字數 4449 閱讀 6750

資料結構實驗報告

實驗名稱:實驗二 迷宮問題

學號:***

姓名:gnosed

實驗日期:2017.10.23

一、實驗目的

1、了解回溯法在求解迷宮問題中的應用

2、進一步掌握棧的使用

二、實驗具體內容

1、實驗題目1:

(1)題目

用回溯法求解迷宮問題,可以用乙個棧儲存探索的序列。並且在該迷宮的行走中,站在一點可以有八個方向選擇。

比如如下的迷宮

enter-> 0   1   1  1   0   0  0   0   0   0

0   0  0   1   0  0   0   1  0   0

0   1  0   1   1  0   0   1  0   0

0   1  0   0   1  0   1   1  0   0

0   1  0   0   1  0   1   1  0   0

1   1  1   0   1  0   1   0  0   0

0   0  1   0   0  0   1   0  1   1

0   0  1   0   0  0   1   0  1   1

0   1  1   0   1  0   1   0  0   0

0   0  0   0   1  0   1   1  0   0 --> exit

下面是可能的路徑(注意:從入口到出口可能有多條路徑,優先選擇的方向不同,路徑可能也不一樣!)

path: ( maze[0][0], maze[1][0],maze[1][1], maze[1][2], maze[2][2],

maze[3][2], maze[3][3], maze[4][3],maze[5][3], maze[6][3],

maze[6][4], maze[6][5], maze[5][5],maze[4][5], maze[3][5],

maze[2][5], maze[2][6], maze[1][6],maze[0][6], maze[0][7],

maze[0][8], maze[1][8], maze[2][8],maze[3][8], maze[4][8],

maze[5][8], maze[5][7], maze[6][7],maze[7][7], maze[8][7],

maze[8][8], maze[8][9], maze[9][9])

enter-> x   1   1  1   0   0  x---x---x   0

x---x---x   1  0   0   x  1   x   0

0   1  x   1   1  x---x   1   x   0

0   1  x---x   1   x  1   1   x   0

0   1  0   x   1  x   1   1  x   0

1   1  1   x   1  x   1   x---x  0

0   0  1   x---x---x   1  x   1   1

0   0   1  0   0   0   1   x  1   1

0   1  1   0   1  0   1   x-- x-- x

0   0  0   0   1  0   1   1  0   x --> exit

(2)分析

規定:1)  迷宮左上角第乙個位置為入口,右下角第乙個位置為出口。

2)  探索的方向為從上按順時針旋轉,上下左右四個方向。

3)  輸入:m,n和m*n個迷宮狀態,0表示通路,1表示有牆。

4)  輸出:若找到走通迷宮的路徑,輸出路徑的各步的位置。否則,提示找不到。

資料結構:

1)  用二維陣列maze[m][n] 來表示迷宮的狀態,0表示通路,1表示有牆,2表示已經走過。

演算法過程:

從入口位置開始,將其入棧。

1)取棧頂元素值(不出棧),

2)按規定方向判斷下一步的位置,即除了原走來的方向,判斷其餘三個方向是否有通路,

3)若發現乙個(若第乙個位置已走過,則判斷下乙個)通路的位置,將其入棧;

4)若三個方向都是牆,則出棧。

5)若發現出口,輸出路線。若棧空,提示沒有路線。若未發現出口而且棧不為空,則重複1)2)3)4)。

(3)實驗**

源**:

#include #include using namespace std;

const int maxm=100,maxn=100;

int maze[maxm][maxn],m,n;

struct pos;

void create()

}struct pos move(struct pos curr)//向右

else if(!maze[x][y+1]&&(y+1)=0&&

maze[x][y-1]!=2)

return curr;//無路,返回原來的位置

}void findpath()

return ;}}

cout<<"no path!"<>m>>n;

create();

findpath();

return 0;

}

測試資料:

input

10  10

0 1 1 1 0 0 0 0 0 0

0 0 0 1 0 0 0 1 0 0

0 1 0 1 1 0 0 1 0 0

0 1 0 0 1 0 1 1 0 0

0 1 0 0 1 0 1 1 0 0

1 1 1 0 1 0 1 0 0 0

0 0 1 0 0 0 1 0 1 1

0 0 1 0 0 0 1 0 1 1

0 1 1 0 1 0 1 0 0 0

0 0 0 0 1 0 1 1 0 0

coutput

(0,0)->(1,0)->(1,1)->(1,2)->(2,2)

->(3,2)->(3,3)->(4,3)->(5,3)->(6,3)

->(6,4)->(6,5)->(5,5)->(4,5)->(3,5)

->(2,5)->(1,5)->(0,5)->(0,6)->(0,7)

->(0,8)->(0,9)->(1,9)->(2,9)->(3,9)

->(4,9)->(5,9)->(5,8)->(5,7)->(6,7)

->(7,7)->(8,7)->(8,8)->(8,9)->(9,9)

input

10  10

0 1 1 1 0 0 0 0 0 0

0 0 0 1 0 0 0 1 0 0

0 1 0 1 1 0 0 1 0 0

0 1 0 0 1 0 1 1 0 0

0 1 0 0 1 0 1 1 0 0

1 1 1 0 1 0 1 0 0 0

0 0 1 0 1 0 1 0 1 1

0 0 1 0 1 0 1 0 1 1

0 1 1 0 1 0 1 0 0 0

0 0 0 0 1 0 1 1 0 0

coutput

no path!
三、實驗小結

首先,在實現**前,能夠分析題目,設計演算法,攥寫文件,算是自己的一大進步。 

敢於實現自己的想法,不侷限於老師的提供的方法。比如本實驗中,我沒有新增迷宮的「牆」,只需在探索時注意界限判斷,這節省了空間。

不足之處在於,剛開始結合題目考慮棧元素的結構時不夠清晰,導致一時無從設計演算法。

本實驗最大的教訓就是,通過原本通過兩個指向結構體的指標判斷這兩個結構體是否相等。其實我想當然的想判斷結構體的值相等,可是函式中返回的是指標,即位址,而且由於不能直接判斷兩個結構體相等,所以並不能通過指標判斷兩個結構體相等,導致這個bug藏得很深。換個思路,從其定義出發,既然不能直接判斷兩個結構體相等,那就判斷結構體裡面的全部元素型別相等。

資料結構實驗報告 資料結構實驗報告

使用c語言中的陣列,實現線性表中的順序結構儲存的查詢 刪除操作。1 初始線性表通過陣列 迴圈 scanf語句實現輸入任意個整數。2 刪除操作的實現,任意輸入乙個要刪除的整數,找到這個元素,將此元素之後的所有元素逐個前移一位,實現刪除操作。3 要求以上2步操作可以重複執行。4 例如 刪除操作執行結果大...

資料結構實驗報告

1 掌握佇列儲存結構的表示和實現方法。2 掌握佇列的入隊和出隊等基本操作的演算法實現。3 了解佇列在解決實際問題中的簡單應用。1 建立順序迴圈佇列,並在順序迴圈佇列上實現入隊 出隊基本操作 驗證性內容 2 建立迴圈鏈佇列,並在迴圈鏈佇列上實現入隊 出隊基本操作 設計性內容 3 實現鍵盤輸入迴圈緩衝區...

資料結構實驗報告

1 理解二叉樹的型別定義與性質。2 掌握二叉樹的二叉鍊錶儲存結構的表示和實現方法。3 掌握二叉樹遍歷操作的演算法實現。4 熟悉二叉樹遍歷操作的應用。1 建立二叉樹的二叉鍊錶儲存結構。2 實現二叉樹的先序 中序和後序三種遍歷操作 驗證性內容 3 應用二叉樹的遍歷操作來實現判斷兩棵二叉樹是否相等的操作 ...