八數碼難題(luogu 1379)

2022-05-12 23:25:07 字數 1111 閱讀 1025

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

輸入格式:

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

輸出格式:

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

輸入樣例

283104765

輸出樣例

4
這是 alphar 學長帶我入門廣搜的例題,當時完全是抄**,因為完全沒有**功力

當時把 codevs 的題目a掉了,現在偶然見到 luogu 有人求助這道題目,點開一看,又是不一樣的方法

這道題目關鍵在於判重,因為如果只是乙個簡單的搜尋,它只會是瞎跑,雜亂無章,我們要做的就是規定它向著什麼方向跑,以及不讓他走了半天又繞回原地

於是就有了a*演算法的思路

構造乙個估價函式,其實說白了就是看他離終點還差多遠

通過迭代加深的方法,如果當前狀態可以到達終點,我們就繼續往下走

至於估價函式……意會就好,無需證明

#include#include

using

namespace

std;

bool

flag;

int k,sx,sy,mp[5][5

];int plan[5][5]=,,};

int dx=;

int dy=;

bool

check()

bool test(int

stp)

void star(int x,int y,int stp,int

last)

if(flag) return

;

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

}int

main()

if(check())

while(++k)

}return0;

}

Luogu1379 八數碼難題

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

Luogu 1379 八數碼難題

吐槽 此題就是一點一點卡過去的 警告 1 千萬不能用dfs搜這種東西 dfs需要遍歷所有狀態才能找到最優解 分分鐘 2 寫結構體的時候要綜合判斷 的加和不加 code luogu judger enable o2 include include include using namespace std...

C P1379 八數碼難題

題目 p1379 八數碼難題 經典演算法教材題目,然後我決定用 hash bfs 搞一下,解釋 附上 include include using namespace std string strat,end 123804765 que 1000000 strat輸入和取佇列頭,end終點,que佇列...