八數碼問題 雙向bfs

2021-09-25 15:31:48 字數 1015 閱讀 6336

如**,注釋的很清楚了

單向的還可以看看這個

以下是參考上面連線的雙向

#include

#include

#include

#include

#include

using namespace std;

int dr[

2]=;

queue<

int>

q1, q2;

map<

int,

int>

c1;//記錄是否走過這個狀態,避免重複,

map<

int,

int>

c2;//記錄到這個狀態需要走多少步

intinit

(int map[3]

[3])

}return ans;

}int

main()

else

int k = begin;

for(

int i =

2; i >=0;

--i)

for(

int j =

2; j >=0;

--j)

}for

(int i =

0; i <4;

++i)

if(c1[temp]

+ c1[begin]==3

) c2[temp]

= c2[begin]+1

;//否則就繼續bfs,則多走了1步

c1[temp]

= c1[begin]

;//按照之前的bfs標記。

if(is ==

true

)else q2.

push

(temp)

;swap

[y][y_new]);

//回到迴圈開始的狀態,繼續所有該層。這個別忘記了!一定要復原。}}

}return0;

}

雙向BFS 八數碼問題

問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 目標狀態 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。例如 2 8 3 1 6 4 7 ...

HDU 1043 八數碼問題 雙向BFS

題目鏈結 題意 給你乙個初始狀態,問你能否移動到最終的完成狀態,如果能輸出任意一組解,否則輸出unsolved。思路 乍一看是個bfs,但是狀態過多會tle或者mle,但是除可bfs確實沒得寫了,這時候就要用到雙向bfs了,起點終點同時bfs,判斷相遇,路徑用string 就行了。注意點 正向路徑s...

BFS入門 八數碼問題

題目描述 初始狀態的步數就算1,哈哈 輸入 第乙個33的矩陣是原始狀態,第二個33的矩陣是目標狀態。輸出 移動所用最少的步數 input 2 8 3 1 6 4 7 0 5 1 2 3 8 0 4 7 6 5 output 思路 這道題bfs搜尋的每一步就是讓矩陣從乙個狀態變為另乙個狀態。所以我們用...