P1379 八數碼難題

2022-02-19 08:20:52 字數 1170 閱讀 5128

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

輸入格式:

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

輸出格式:

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

輸入樣例1:

283104765

輸出樣例1:

4

思路:bfs,我們首先要找到空格即0所在的位置,然後向四個方向擴充套件,如果目標狀態沒有訪問過,那就轉移到目標狀態,然後加入佇列中。之後使用map去重,我們把每乙個狀態都轉化成乙個雜湊值,如果訪問了就將其設成1,如果目標雜湊值等於123804765,即找到了最少轉換次數。

**:

#include#include

#include

#include

#include

#include

using

namespace

std;

static

int n=9

;static

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

map

< long

long , bool > vis;//

去重 struct

mt;mt be;

queue

< mt >q;

static

int ex(mt x)//

計算雜湊值

static

intbfs(mt x)

for(int i=1;i<=3;++i)

for(int j=1;j<=3;++j)//

尋找當前0的位置 }}

}else

continue

; }

} }int

main()

be.s=ex(be);be.num=0;//

將當前狀態轉為雜湊值,並且初始化操作次數

bfs(be);//

搜尋 return0;

}

P1379 八數碼難題

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

P1379 八數碼難題

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

P1379 八數碼難題

當前的棋盤,空格的位置和走過的步數。棋盤可以用全域性變數來存。每次往上下左右四個方向搜即可。1.上下界剪枝 上界 不好求 下界 最好的情況就是 當前情況有多少個位子與目標狀態不同,即 sum sum g i j des i j 雖然下界對剪枝沒什麼用 2.搜尋順序優化 由於乙個地方可以重複走所以順序...