C 20191206 迷宮問題

2021-10-05 22:18:49 字數 4028 閱讀 3392

資料結構:迷宮問題

【迷宮問題】

生成全連通迷宮

生成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...