CodeVs 1225 八數碼難題

2021-06-23 08:57:31 字數 2239 閱讀 7255

yours和zero在研究a*啟發式演算法.拿到一道經典的a*問題,但是他們不會做,請你幫他們.

問題描述

在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:給出一種初始布局(初始狀態)和目標布局(為了使題目簡單,設目標狀態為123804765),找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。

輸入初試狀態,一行九個數字,空格用0表示

只有一行,該行只有乙個數字,表示從初始狀態到目標狀態需要的最少移動次數(測試資料中無特殊無法到達目標狀態資料)

這題超經典,值得學搜尋的人都去弄一下,可以先用廣搜→雙廣→a*這樣你的搜尋就能掌握到方向了。

/*

八數碼難題

單向bfs+康托展開+hash

*/#include#include#includeusing namespace std;

const int dx[5]=;

const int dy[5]=;

struct node

;node e;

node d[400005];

int hash[400005];

long fc[10]=;

long total=0;

long head=0, tail=0;

bool flag=false;

void debug(node x)

}

num+=fc[9-i]*temp;

}return num;

}bool hash(node x)

return false;

}void sp(int &a, int &b)

bool pd(int x, int y)

void move(int x, int y)

}else tail--;

} }}void bfs()

total=kt(e);

hash(d[0]);

bfs();

return 0;

}

/*八數碼難題 雙向bfs+hash+cantor 參考了hzwer大犇的**,寫的真不錯

*/#include#include#includeusing namespace std;

const int dx[5]=;

const int dy[5]=;

struct node;

node d[2][400000];//0代表正向bfs, 1代表反向bfs ;

long fc[10]=;

int hash[2][400000];//hash判重+儲存step

int step[2][400000]=;

long head[2], tail[2]=;

bool flag=0;

void debug1(int k, int temp)

return num;

}void sp(int &a, int &b)

bool pd(int x, int y)

void bfs(int k)

} for (int i=1; i<=4; i++)

{ int xx=dx[i]+x;

int yy=dy[i]+y;

if (pd(xx, yy))

{for (int i=1; i<=3; i++)

for (int j=1; j<=3; j++)

d[k][tail[k]].mp[i][j]=d[k][head[k]].mp[i][j];

sp(d[k][tail[k]].mp[x][y], d[k][tail[k]].mp[xx][yy]);

int temp=kt(d[k][tail[k]].mp);

if (hash[k][temp]==-1)

{step[k][tail[k]]=step[k][head[k]]+1;

hash[k][temp]=step[k][tail[k]];

if(hash[0][temp]!=-1 && hash[1][temp]!=-1)

{//cout<>a;

for (int i=0; i

codevs1225 八數碼難題

題目描述 description yours和zero在研究a 啟發式演算法.拿到一道經典的a 問題,但是他們不會做,請你幫他們.問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布...

codevs 1225 八數碼難題 題解

yours和zero在研究a 啟發式演算法.拿到一道經典的a 問題,但是他們不會做,請你幫他們.問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題...

codevs1225八數碼難題(搜尋 )

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解yours和zero在研究a 啟發式演算法.拿到一道經典的a 問題,但是他們不會做,請你幫他們.問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的...