#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的階乘
int si;
int ei;
//從答案向前尋找,統計所有的step,後面用於查詢
int toint(int a[3][3])//康拓展開
t += (cnt)*d[8 - i];
}return t+1;
}typedef
struct node
step = ste;
id = _id;
loc = _loc;
}}node;
queue
sta;
int op[4][2] = ;
int main()
int x;
for (int i = 0; i < 9; i++)
ei = toint(e);
node firnode(e, 0,ei,8);
sta.push(firnode);
step[ei] = 0;
while (!sta.empty())}}
}string s;
ios::sync_with_stdio(false);
while (cin >> s)
s[i / 3][i % 3] = s[0] - '0';
}si = toint(s);
if (step[si] == -1)
else
else
if (p[p][1] == 1)
else
if (p[p][1] == 2)
else
p = p[p][0];
}cout
<< endl;}}
return
0;}
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作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...
HDU 1043 八數碼問題 雙向BFS
題目鏈結 題意 給你乙個初始狀態,問你能否移動到最終的完成狀態,如果能輸出任意一組解,否則輸出unsolved。思路 乍一看是個bfs,但是狀態過多會tle或者mle,但是除可bfs確實沒得寫了,這時候就要用到雙向bfs了,起點終點同時bfs,判斷相遇,路徑用string 就行了。注意點 正向路徑s...