12.4 實驗三 棧和佇列的綜合應用
8. (必做題)迷宮問題。假設迷宮由m行n列構成,有乙個入口和乙個出口,入口座標為(1,1),出口座標為(m,n),試設計並驗證以下演算法:找出一條從入口通往出口的路徑,或報告乙個「無法通過」的資訊。
(1) 用c語言實現順序儲存結構上佇列的基本操作,然後利用該佇列的基本操作找出迷宮的一條最短路徑。
(2) 設計乙個二維陣列maze[m+2][n+2]表示迷宮,陣列元素為0表示該位置可以通過,陣列元素為1表示該位置不可以通行。maze[1][1]、maze[m][n]分別為迷宮的入口和出口。
(3) 輸入迷宮的大小m行和n列,動態生成二維陣列;由隨機數產生0或1,建立迷宮,注意m*n的迷宮需要進行擴充套件,擴充套件部分的元素設定為1,相當於在迷宮周圍布上一圈不准通過的牆。
(4) 要求輸出模擬迷宮的二維陣列;若存在最短路經,則由出口回溯到入口(出佇列並利用棧實現),再列印從入口到出口的這條路徑,例如(1,1),……,(i,j),……,(m,n);若沒有路徑,則列印「no path!」。
(5) 迷宮的任一位置(i,j)上均有八個可以移動的方向,用二維陣列direction存放八個方向上的位置偏移量。
direction[8][2]=,,,,,,,};
(6) 為避免出現原地踏步的情況為了標誌已經通過的位置,採用乙個標誌陣列mark[m+2][n+2],初值均為0,在尋找路徑的過程中,若通過了位置(i,j),則將mark[i][j]置為1。
(7) 為了記錄查詢過程中到達位置(i,j)及首次到達(i,j)的前一位置(i_pre,j_pre),需要記住前一位置(i_pre,j_pre)在佇列中的序號pre,即佇列中資料元素應該是乙個三元組(i,j,pre)。
(8) 搜尋過程簡單描述如下:將入口maze[1][1]作為第乙個出發點,依次在八個方向上搜尋可通行的位置,將可通行位置(i,j,pre)入隊,形成第一層新的出發點,然後依次出隊,即對第一層中各個位置分別搜尋它所在八個方向上的可通行位置,形成第二層新的出發點,…,如此進行下去,直至達到出口maze[m][n]或者迷宮所有位置都搜尋完畢為止。
#include
using namespace std;
int n,m;
const
int n =
111;
typedef pair<
int,
int> pii;
char s[n]
[n];
int d[n]
[n];
pii p[n]
[n];
//p陣列用於記錄迴路。
queue q;
intbfs
(void
)// 寬搜找最短路);
int dx[8]
=;int dy[8]
=;while
(q.size()
)); d[x]
[y]= d[t.first]
[t.second]+1
;}}}
return d[n-1]
[m-1];
}void
out(
void
)//用p陣列回溯,標記路徑。
cout <<
"路徑*:"
<< endl;
for(
int i=
0;i) cout << endl;}}
intmain()
if(bfs()==
-1) cout <<
"迷宮無解"
<< endl;
else}/*
測試資料:
10 10
最短路數為:10
路徑*:
* 0 0 0 0 0 1 0 0 0
* 0 0 1 0 0 0 0 0 0
0 * 0 0 0 0 0 0 0 0
0 1 * 0 1 0 0 0 0 0
0 0 0 * 1 0 0 0 0 0
1 1 0 0 * * 1 0 1 0
1 0 1 0 0 0 * 0 0 1
0 0 0 0 0 0 0 * 0 0
0 0 0 1 0 0 0 1 * 0
0 0 0 0 1 1 0 1 0 *
--------------------------------
process exited with return value 0
press any key to continue . . .
*/
資料結構實驗
資料結構實驗 寫乙個學生管理系統 如下 define overflow 1 define ok 1 define error 1 define maxsize 6 define increment 10 include include include include typedef int stat...
資料結構實驗
資料結構實驗 實驗一 順序表的實現及應用 實驗一 順序表的實現及應用 一 實驗實習目的及要求 了解和掌握線性表的順序儲存結構 掌握用c語言上機除錯線性表的基本方法 掌握線性表的基本操作 插入 刪除 查詢以及線性表合併等運算在順序儲存結構和鏈結儲存結構上的運算,以及對相應演算法的效能分析。二 實驗實習...
資料結構實驗報告 資料結構實驗報告
使用c語言中的陣列,實現線性表中的順序結構儲存的查詢 刪除操作。1 初始線性表通過陣列 迴圈 scanf語句實現輸入任意個整數。2 刪除操作的實現,任意輸入乙個要刪除的整數,找到這個元素,將此元素之後的所有元素逐個前移一位,實現刪除操作。3 要求以上2步操作可以重複執行。4 例如 刪除操作執行結果大...