1、任務簡述:
設計非遞迴演算法,根據入口和出口位置將給定迷宮中的全部可行路線輸出,並標記出其中的最短路徑;
int mg[10]
[10]=
,,,,
,,,,
,,};
//該二維陣列表示迷宮,0表示可行,1表示不可行。
要求:
(1)提示使用者從鍵盤輸入入口位置和出口位置;
(2)輸出所有可行路線及其路徑長度(路徑中包含的點的個數),並標記出其中的最短路徑(最短路徑可能有一條或者若干條)
(3)如果入口與出口之間不存在路徑,也請給出相應的提示資訊;
2、演算法描述:
首先用寬搜來尋找最短路徑的長度,然後用深搜來找出所有路徑,並且標記出其中的最短的路徑。其中寬搜採用的是佇列,深搜採用的是棧。思路都是去尋找可以走的幾個方向,逐個判斷就行了。
3、源**:
#include
#include
#include
#define n 100
int mg[10]
[10]=
,,,,
,,,,
,,};
//該二維陣列表示迷宮,0表示可行,1表示不可行。
int flag[10]
[10]=
,,,,
,,,,
,,};
//該二維陣列表示迷宮,0表示可行,1表示不可行。
int ms[4]
[2]=
,,,}
;int
bfs(
int start_x,
int start_y,
int end_x,
int end_y)
;//寬度優先搜尋,尋找最短路徑,並且返回他最短路徑的節點個數。
void
dfs(
int k,
int start_x,
int start_y,
int end_x,
int end_y)
;//深度優先搜尋,尋找所有可行路徑
main()
intbfs
(int start_x,
int start_y,
int end_x,
int end_y)
//寬度優先搜尋,尋找最短路徑,並且返回他最短路徑的節點個數。
if(nx == end_x&&ny == end_y)}if
(flag ==1)
break
; head++;}
if(flag ==1)
else
return0;
}void
dfs(
int k,
int start_x,
int start_y,
int end_x,
int end_y)
//深度優先搜尋,尋找所有可行路徑
printf
("---有%d個節點\n\n"
,count)
; top--
; flag[cx]
[cy]=0
;continue;}
if(dir[top]==4
) nx = cx + ms[dir[top]][
0]; ny = cy + ms[dir[top]][
1]; dir[top]++;
if(flag[nx]
[ny]==0
)}printf
("一共有%d種走法"
,sum);}
//145行
4、執行結果
起點為:(1,1),終點為:(8,8)
由於迷宮中任意兩個點都是聯通的,我們修改了一下迷宮:
int mg[10][10]=,,,
,,,,
,,, }; //該二維陣列表示迷宮,0表示可行,1表示不可行。
然後尋找起點:(1,1),終點:(8,2):
5、總結
心得體會:
執行結果正確,輸出也是正序輸出,成功統計路徑數量,不過可以學習老師的system(「pause」),就是每輸出10個或20個停一下,再輸出。不過這個影響不大。
資料結構課程設計 迷宮問題課程設計報告
上學時沒學過資料結構和演算法,於是現在有機會就自學。下面是我最近在等待進入專案組期間,花了1小時學習了一下迷宮問題。下面是我學習時找到的一篇課程設計的報告,然後自己先看懂,然後又在vc6.0下執行了。迷宮問題 一 需求設計 以乙個m m 的方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式...
課程設計 迷宮問題
課程設計 迷宮問題 c 個人設計 2010 01 16 15 06 字型大小 大大 中中 小小 迷宮問題 1設計目的 要求 以乙個m n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。基本要求 首先實現乙個以煉表作...
資料結構課程設計
資料結構課程設計 include define n 30 include include includeusing namespace std struct node typedef node phone,mingzi node hashnumble node hashname int hash1 ...