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