P1379 八數碼難題

2022-06-18 16:24:10 字數 996 閱讀 8750

當前的棋盤,空格的位置和走過的步數。棋盤可以用全域性變數來存。每次往上下左右四個方向搜即可。1.上下界剪枝:

上界:不好求

下界:最好的情況就是——當前情況有多少個位子與目標狀態不同,即

\[\sum_^\sum_^[g[i][j]≠des[i][j]]

\]雖然下界對剪枝沒什麼用

2.搜尋順序優化:由於乙個地方可以重複走所以順序隨意。

4.最優化剪枝:設當前的答案為ans,那麼當深度》ans時就沒必要搜了。

5.記憶化:日常沒什麼好記的從1開始列舉深度,由迭代加深性質可知當第一次搜尋到答案時必定是最優解,所以我們沒必要做最優化剪枝了。設計估價函式。結合上面提到的下界,我們可以設計這樣乙個函式:

\[f(g)=\sum_^\sum_^[g[i][j]≠des[i][j]]

\]當當前深度加上預估值》當前的最大深度時就不需要往下搜了。

#include#include#include#define maxn 4

using namespace std;

const int des[4][4]=,,,};

const int dir[4][2]=,,,};

int g[maxn][maxn],ans;

inline int abs(const int &x)

inline int evaluate()

inline bool check(const int &x,const int &y)

void idastar(int x,int y,int dep,int pre_dir,const int &maxdep)

for(register int i=0;i<4;i++) if(i+pre_dir!=3)

}}int main()

}if(!evaluate())

for(register int maxdep=1;;maxdep++)

}lzs:;

return 0;

}

P1379 八數碼難題

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

P1379 八數碼難題

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

P1379 八數碼難題

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