HDU1043 八數碼問題

2021-07-30 05:55:04 字數 1123 閱讀 5338

#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...