如**,注釋的很清楚了
單向的還可以看看這個
以下是參考上面連線的雙向
#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搜尋的每一步就是讓矩陣從乙個狀態變為另乙個狀態。所以我們用...