P1379 八數碼難題 雙向bfs

2021-09-27 13:30:39 字數 1294 閱讀 2364

題目描述

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

輸入格式

輸入初始狀態,一行九個數字,空格用0表示

輸出格式

只有一行,該行只有乙個數字,表示從初始狀態到目標狀態需要的最少移動次數(測試資料中無特殊無法到達目標狀態資料)

輸入 #1

輸出 #1

#include

#include

#include

using namespace std;

int s, e =

123804765

, g[4]

[4], sx, sy;

//g用來存放棋盤 sx, sy用來記錄0的位置

int dx[4]

=;int dy[4]

=;map<

int,

int> v;

//標記訪問的狀態 0表示未訪問 1表示順序訪問 2 表示逆序訪問

map<

int,

int> ans;

//標記答案的步數 (訪問該棋子狀態的步數)

queue<

int> q;

//將壓縮的數字轉化為棋盤

void

tog(

int num)}}

//將棋盤壓縮成乙個數字

inttonum()

}return num;

}void

bfs()if

(3== v[cur]

+ v[next]

) v[next]

= v[cur]

;// 與上一點的狀態相同

ans[next]

= ans[cur]+1

; q.

push

(next)

;//回溯下棋盤 走下乙個方向

swap

(g[sx]

[sy]

, g[fx]

[fy]);

}}}int

main()

bfs();

return0;

}

P1379 八數碼難題

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

P1379 八數碼難題

雙向bfs 右手進入傳送門 有乙個3 3的棋盤,其中有8個編號為1 8的棋子和乙個空格,空格四周的棋子可以向空格移動,給出棋盤的初始狀態,問至少移動多少部可以達成目標狀態。注意 棋盤的狀態用乙個九位數表示。顯然是一道搜尋題,而且狀態比較好表示 乙個九位數 搜尋的量也不大,所以可以用bfs。這種移動棋...

P1379 八數碼難題

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