資料結構:迷宮問題
【迷宮問題】
生成全連通迷宮
生成nn大小的迷宮
隨機連通該迷宮的各個節點,使該迷宮全連通
通路數不超過1.5n*n-n-0.5
迷宮節點用數字表示,位數等於最大編號的位數,位數不足的編號用0補齊
保證各行各列對齊
不同節點之間的通路用短橫(豎)線表示,不存在通路的用空格表示
求最短路徑
輸入任意兩點間的編號
輸出這兩點之間的所有最短路徑
【核心演算法】
dijstra演算法求最短路徑
#include
#include
//i/o流控制標頭檔案
#include
//非自定義泛型演算法標頭檔案
#include
#include
#include
//獲取當前時間的庫函式
using
namespace std;
//定義節點結構體
struct node
//節點析構函式,用於釋放記憶體空間(當結構體中包含非基本變數時需要使用析構函式)
~node()
};typedef vector
> path;
//路徑
typedef set pathset;
//路徑集合,這是乙個三維向量
//比較節點id大小
bool
compareid
(const node* n1,
const node* n2)
intcalculate
(int i,
int j,
int n)
struct maze
}sort
(nodes.
begin()
, nodes.
end(
), compareid)
;//給節點排序
//路徑初始化
for(
int i =
0; i < nodes.
size()
;++i)}}
node*
getnode
(int row,
int col)
//加一條邊的函式
set>
addedge
(int edge)
//橫向加邊
else
//縱向加邊
s = n1-
>connected;
s.insert
(n2-
>connected.
begin()
, n2-
>connected.
end())
;//更新當前節點連線集
//更新所有節點連線集
for(
auto
& i : s)
numedges++
;//邊數+1
return s;
}//隨機加邊並判斷該迷宮是否全連通
intconnected()
while
(!flag)
return numedges;
//返回總邊數
}//列印迷宮函式
void
printmaze()
//列印迷宮
for(
int i =
0; i < size;
++i)
//輸出當前節點,位數不足補零
if(a ==0)
}else
if(a < max)
} cout << i * size + j;
//橫向輸出
if(nodes[i * size + j]
->right !=
nullptr
&& j != size -1)
else cout <<
" ";}
cout << endl;
//縱向輸出
for(
int j =
0; j < size;
++j)
else
} cout << endl;}}
//尋找距離當前節點最近的節點
node*
findmin
(int start, vector
>
& v)
else
if(t < mindd)
//若t}
//遍歷所有節點後,minid即為距離起始節點最近的節點的id值
node* n = v[minid]
; v.
erase
(v.begin()
+ minid)
;return n;
}//dijkstra演算法尋找兩點間最短路徑
void
dijkstra
(int start)
else
s.push_back
(n);
node* l,
* r,
* u,
* d;
l = n-
>left;
r = n-
>right;
u = n-
>up;
d = n-
>down;
int idx;
//若節點n的左邊是連通的
if(l !=
nullptr
&& l-
>id > start)}}
//若節點n的右邊是連通的
if(r !=
nullptr
&& r-
>id > start)}}
//若節點n的上邊是連通的
if(u !=
nullptr
&& u-
>id > start)}}
//若節點n的下邊是連通的
if(d !=
nullptr
&& d-
>id > start)}}
}}};
//列印所有最短路徑
void
printpath
(path path)
cout << path[path.
size()
-1]-
>id << endl;
}int
main()
int id1, id2;
cout <<
"請輸入起始節點和終止節點的編號(要求:起始節點小於終止節點)"
<< endl;
cout << endl;
cin >> id1 >> id2;
cout << endl;
int length = maze.shortest[
calculate
(id1, id2, maze.nodes.
size()
)]; cout <<
"從 "
<< id1 <<
" 到 "
<< id2 <<
" 的最短路徑長為: "
<< length << endl;
cout << endl;
pathset ps = maze.pathsets[
calculate
(id1, id2, maze.nodes.
size()
)]; cout<<
"以下為從 "
<< id1 <<
" 到 "
<< id2 <<
" 的所有最短路徑: "
<< endl;
cout << endl;
for(
auto
& p : ps)
}
【執行結果】
隨機生成7*7的全連通迷宮
C 解決迷宮問題
include include define m 11 define n 10 預設迷宮結構 char maze array m n 記錄迷宮結點的路過次數 int maze node passby array m n 輸出當前的迷宮局勢 void print maze 輸出記錄路徑結點出現次數的陣...
c解決迷宮問題
問題描述 在迷宮中求從入口到出口的一條簡單路徑。迷宮可用方塊來表示,每個方塊或者是通道 用空白方塊表示 或者是牆 用帶陰影的方塊表示 迷宮求解 這個經典的問題,應用棧這種資料結構,自己設計乙個方案,並上機實現從入口到出口的一條簡單路徑。為了表示迷宮,用二維陣列表示,如 int a 10 8 3是入口...
DFS 迷宮問題(C )
定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。左上角到右下角的最短路徑,格式如樣例所示。0 1 0 0 0 0 1 0...