迷宮深搜或廣搜尋路問題詳解,c 實現

2021-10-22 02:05:27 字數 3535 閱讀 8478

自定義迷宮類以及相關結構體,直接上**,有空我會把佈線問題也更新一下

下面展示一些maze.h

// an highlighted block

#include

#include

#include

#include

using

namespace std;

class

maze

;void

ramdonint

(int=10

);void

showmaze()

const

;int

getsize()

const

;int

*operator

(int row)

;//雖然三五法則,但是這裡好像真的不需要拷貝構造和等號過載?

~maze()

;private

:int size;

int*

* maze;

bool isinit;};

struct position

;void

operator

=(position& p);}

;

下面展示一些maze.cpp

// an highlighted block

#include

"maze.h"

void maze::

ramdonint

(int size)

;for

(int i =

0; i <= size +

1; i++);

if(i ==

0|| i == size +1)

//第一行行為空

for(

int j =

1; j <= size; j++

)//第一列為空,最後一列為空}}

isinit =

true;}

else

else}}

} maze[1]

[1]=

0;maze[size]

[size]=0

;}void maze::

showmaze()

const

cout << endl;}}

maze::

~maze()

}delete

maze;

maze =

nullptr

;}

下面展示一些main.cpp

// an highlighted block

#include

"maze.h"

bool

findpath

(maze& m)

;void

main()

while(!

findpath

(m))

;system

("cls");

m.showmaze()

; m.

~maze()

;system

("pause");

}bool

findpath

(maze& m)

//深搜,,

,};//右下左上

stack

*path;

path =

new stack()

;int size = m.

getsize()

;for

(int i =

0; i <= size+

1; i++

) position here(1

,1);

m[1][

1]=2

;int option =0;

int maxoption =3;

while

(here.row != size || here.col != size)

option++;}

if(option <= maxoption)

else

else

m[here.row]

[here.col]=2

; m[next.row]

[next.col]=2

; here = next;}}

m[size]

[size]=2

;delete path;

delete

offset;

return

true

;}

執行結果

2為曾經走過的路徑

下面展示一些廣搜實現尋路

// an highlighted block

bool

findpath2

(maze& m)

//廣搜,,

,};//右下左上

queue

*path;

path =

new queue()

;int size = m.

getsize()

;for

(int i =

0; i <= size +

1; i++

) position here(1

,1);

m[1][

1]=2

; position nbr;

int numofnbrs =4;

//同一方格能到達的方格數

while

(true

) path-

>

push

(nbr);}

if(path-

>

empty()

) here = path-

>

front()

;//取下乙個位置,可能一次push進去了很多個位置,但是都是右下左上順序取

path-

>

pop();

}}//把所有跟出發點聯通的區域都標記好之後

//構造路徑,

int length = m[size]

[size]-2

; position *way =

new position[length]

;//從終點逆推

for(

int j = length -

1; j >=

0; j--

) here = nbr;

//更新位置

}delete path;

delete

way;

delete

offset;

return

true

;}

迷宮問題(廣搜與深搜)

定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。input 乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。output 左上角到右下角的最短路徑,格式如樣例所示。sa...

搜尋(深搜 廣搜)

我記得在遙遠的2017年,我會敲的搜尋也只有暴力列舉了。那個時候的我深搜剛會一丟丟,所以也只配切切水題,然而經常死迴圈re那是肯定的。如今的我因為在多次比賽中都死於搜尋,那就必須得認真磕一下了。其實是這樣的 我眼裡認為的暴力就真的只是暴力,暴力無非就兩種 列舉打表和模擬。然而在這麼多次比賽後,我總能...

迷宮問題 廣搜

定義乙個二維陣列 int maze 5 5 queue 26 int head 0,tail 0,a 5 5 book 5 5 void function int tail 引數是隊尾 else function queue tail f 如果隊尾的父節點不是0 就將該父節點作為新的隊尾繼續呼叫 這...