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來表示。空格周圍的...