洛谷P1379八數碼題解

2022-04-12 02:23:34 字數 1132 閱讀 9171

這種題目顯然是個\(bfs\)。(因為要求最小步數)

每次列舉0向哪移動,用\(map\)判重即可大佬都是用康托展開或者是hash,但是我不會

用\(map\)是因為轉成9位數之後開\(bool\)陣列存不下會hash和康托展開的大佬當我在放屁

單向\(bfs\):

int x[9]=,y[9]=;//數轉矩陣用的

int dx[4]=,dy[4]=;//0的移動方向

int hy[4][4]=//矩陣的位置對應的數的位置, ,

, };string k;

struct qwq;

queueq;

mapusd;

int main()

qwq a;

a.u=k;a.bs=0;a.lig=lig;

q.push(a);

while(!q.empty())

int lg=b.lig;

for(int i=0;i<4;i++)}}

交上去

聽取t聲一片.jpg

當然最後乙個點是起始狀態=終點狀態

好了我們知道單向\(bfs\)在這裡莫得前途了

於是我們可以搞雙向\(bfs\)

雙向\(bfs\):

int x[9]=,y[9]=;//數轉矩陣用的

int dx[4]=,dy[4]=;

int hy[4][4]=//矩陣的位置對應的數的位置, ,

, };string k;

queueq1,q2;

mapusd,bu1,bu2;//usd記錄被哪一邊訪問過,bu1記錄q1中狀態的步數,bu2記錄q2中狀態的步數(感覺bu1和bu2可以和起來的樣子)

void bfs()

//如果兩邊搜的點能接上,則找到最短步數

if(!usd[pd]) //如果該狀態還未被訪問過

}} else

if(!usd[pd])

}} if(bj) break;//找到答案就跳出

}}

當然,要注意特判起始狀態=終點狀態的情況

然後就\(ac\)了,而且跑的很快

啥?你說a*?

雙向bfs能搞定的東西用什麼a*

洛谷 P1379 八數碼難題

在3 3 的棋盤上,擺有八個棋子,每個棋子上標有 1 至 8的某一數字。棋盤中留有乙個空格,空格用 0 來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為 123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局...

洛谷 P1379 八數碼難題

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

洛谷 P1379 八數碼難題

洛谷傳送門 jdoj傳送門 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始...