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搜尋的每一步就是讓矩陣從乙個狀態變為另乙個狀態。所以我們用...