由八數碼問題引入。對BFS有更深考慮

2021-06-20 05:44:26 字數 1381 閱讀 4596

12號到今天共研究八數碼問題poj1077,首先用的是普通bfs,遇到很多問題,開始用乙個二級指標作為結構成員,知道了二級指標與二維數值名的不同!講得不錯。發現自己**能力渣死!進入正題,用bfs過不了,先學習了八數碼問題有解條件,並擴充套件到n數碼有解問題。做到奇數偶數剪枝,過不了,太慢,於是學習了hash判重,學習了康托展開(排列與數字的一一對應關係),效率大大增加!但是別人這樣過了都,我是過不了啊!於是去學雙廣!沒怎麼看明白,,,很想放棄了!於是去學習了a*演算法!(啟發式搜尋),46ms,bfs是最普通的a*,那麼,我用優先佇列優化,設定啟發函式,把優先順序高的先出隊!本質已經破壞了bfs的分層搜尋,倒是有點dfs了,我名之為bdfs!,有方向性!這樣找一組解很容易!不用遍歷所有!

於是去切了騎士問題,先是8格的的,再是n格的,接下!

#include//優先(小的優先)佇列bfs+hash判重+奇數偶數剪枝

#include#include#include#include#includeusing namespace std;

string a;

int f[4][2]=;//方向

bool state[362881];

int fac[10]=;

struct xy

};int get_abs(string aa) //只要第一次獲得,其他改變修改

return res;

}bool has_solution() //無解條件,奇偶剪枝!

}dian.abs_to_end=get_abs(dian.aa);

q.push(dian);

if(dian.aa=="123456789")return dian.s;

while(!q.empty())

else if(i==1)

else if(i==2)

else if(i==3)

if(next.aa=="123456789")return next.s;

string ts=next.aa; //int hash(string ts)

int res=0;

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

if(state[res])continue;

state[res]=true;

q.push(next);}}

}}int main()

for(int i=0;i}

memset(state,0,sizeof(state));

if(!has_solution())cout<<"unsolvable"

} return 0;

}

由八數碼問題引入。對BFS有更深考慮

12號到今天共研究八數碼問題poj1077,首先用的是普通bfs,遇到很多問題,開始用乙個二級指標作為結構成員,知道了二級指標與二維數值名的不同!講得不錯。發現自己 能力渣死!進入正題,用bfs過不了,先學習了八數碼問題有解條件,並擴充套件到n數碼有解問題。做到奇數偶數剪枝,過不了,太慢,於是學習了...

雙向BFS 八數碼問題

問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 目標狀態 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。例如 2 8 3 1 6 4 7 ...

BFS入門 八數碼問題

題目描述 初始狀態的步數就算1,哈哈 輸入 第乙個33的矩陣是原始狀態,第二個33的矩陣是目標狀態。輸出 移動所用最少的步數 input 2 8 3 1 6 4 7 0 5 1 2 3 8 0 4 7 6 5 output 思路 這道題bfs搜尋的每一步就是讓矩陣從乙個狀態變為另乙個狀態。所以我們用...