簡介:乙個九宮格中有八個數字,一位空格,每次只能移動相鄰的兩個格仔,現要求把九宮格變為「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作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...