HDOJ 1043 八數碼問題(A 解法)

2022-03-30 05:19:52 字數 1650 閱讀 3586

簡介:乙個九宮格中有八個數字,一位空格,每次只能移動相鄰的兩個格仔,現要求把九宮格變為「12345678x」的樣子(x代表空格)

sample input

2 3 4 1 5 x 7 6 8

sample output

ullddrurdllurdruldr

這裡我們要用到康拓展開,具體介紹如下:

康拓展開並不難,相信各位能看懂,所以我們是把九宮格看成了乙個字串陣列來解決;用bfs來尋找轉移的方法,但是單純的bfs容易tle,那麼好,我們這裡就用到a*演算法,a*演算法其實並不難,在這裡的bfs基礎上我們加乙個評估函式h(),h()是怎麼評估的呢?是通過當前序列每個數字與標準情況下相比較(這個有點難說明白,建議看看一些迷宮類問題,即每走一步,在這一步到終點觀望一下還剩多少距離)

通過使用乙個優先佇列,能降低時間複雜度。相比盲目的bfs來說,是乙個相對比較「智慧型」的演算法,**如下:

#include#include

#include

#include

#include

using

namespace

std;

#define n 9

struct

point

}startpoint;

const

int fac = ;//

康托序列

const

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

const

char option[4]=;

bool visited[363000

];int pre[363000

];char op[363000

];stack

stk;

int cantor(point p) //

康拓展開

return

ans;

}int abs(int x) //

自定義絕對值

int h(point p) //

評估函式

return

val;

}bool

bfs()

}return

false;}

bool

inversionnumbercheck()

}return cnt&1;}

intmain()

if(inversionnumbercheck())

startpoint.g=0

; startpoint.f =h(startpoint);

int startcantor =cantor(startpoint);

bfs();

int index =0

;

while(index!=startcantor)

while(!stk.empty())

cout

HDU1043 八數碼問題

include include include using namespace std 通過康托展開來hash 9 有362880 const int maxn 400000 int step maxn int p maxn 2 用於記錄與前面乙個的相對路徑 int d 10 用來統計0到9的階乘 ...

HDU 1043 八數碼問題 A 搜尋

by cxlove 第乙個a 搜尋,a 是一種啟發式搜尋,g為已花代價,h為估計的剩餘代價,而a 是根據f g h作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...

HDU 1043 八數碼問題 A 搜尋

by cxlove 第乙個a 搜尋,a 是一種啟發式搜尋,g為已花代價,h為估計的剩餘代價,而a 是根據f g h作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...