HDU 1043 搜尋 A 演算法

2021-07-10 16:26:55 字數 1216 閱讀 7616

#include #include #include #include #include #include using namespace std;

const int maxn = 4e5 + 10;

const int mlen = 30;

char str[mlen], d = "udlr";

int ha[9] = ;

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

int vis[maxn], n;

struct node

void print() };

struct path

;path p[maxn];

int get_hash(const node &e)

return ans;

}int get_h(const node &e)

bool get_dir(const node &e, int i, int &x, int &y)

void print(int x)

void a_star(node e)

priority_queueque;

que.push(e);

while (!que.empty())

que.push(a);

} }}

int main(int argc, char const *argv)

cnt++;

} int tol = 0;

for (int i = 0; i < 9; i++)

if (e.f[i / 3][i % 3] == 0) continue;

else for (int j = 0; j < i; j++)

if (e.f[j / 3][j % 3] == 0) continue;

else if (e.f[j / 3][j % 3] > e.f[i / 3][i % 3]) tol++;

if (tol & 1) printf("unsolvable\n");

else a_star(e);

} return 0;

}

給出乙個3*3的矩陣裡面是12345678x的排列,每次可以移動x到四個方向,求一條路徑把它變成12345678x。

其實就是以前的手機上帶的那個智慧型拼圖,有一塊是空的,通過上下左右移動空的最後讓所有位置復原。

康拓展開,儲存狀態以供雜湊。對曼哈頓距離進行a*搜尋。

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作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...

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的階乘 ...