搜尋例題 八數碼難題 luoguP1379

2021-09-27 13:22:25 字數 1782 閱讀 2743

同時把開始和結束狀態放入佇列搜尋,用map去重和記錄步數答案

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

typedef long long ll;

inline int read()

while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();

return x*f;

}int s,t=123804765;

queueq;

mapvis;//去重,0表示沒訪問過,1表示正序,2表示逆序搜

mapans;//記錄答案

int a[4][4];

int nx,ny,fx,fy;

int dx[4]=;

int dy[4]=;

int main()

q.push(s);

q.push(t);

ans[s]=0;

ans[t]=1;

vis[s]=1;

vis[t]=2;

while(!q.empty())

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

} //陣列轉數字

if(vis[now]==vis[u])

if(vis[now]+vis[u]==3)

ans[now]=ans[u]+1;//維護這個狀態的步數

vis[now]=vis[u];//方向相同

q.push(now);

swap(a[fx][fy],a[nx][ny]);

//回溯

} }return 0;

}

何為迭代加深:

適用於搜尋可能深度很大,但答案深度很小的搜尋

限制每次搜尋的深度,每次加大深度,直到搜到答案

何為啟發式搜尋:

應用一自定義的估價函式,描述當前搜尋狀態和目標狀態的差別大小

優先搜尋差距小的,大大減小複雜度。

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

typedef long long ll;

int t[4][4]=, ,

, };

int a[5][5];

int dx[4]=;

int dy[4]=;

int flag;

char ss[15];

int dep;

int tx,ty,nx,ny;

bool check()

} }return 1;

}bool test(int step)

}} }

return 1;

} void astar(int step,int x,int y,int pre)

return;

} if(flag) return;

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

swap(a[x][y],a[nx][ny]);//回溯 }}

int main()

} if(check())

while(++dep)

} return 0;

}

八數碼難題

今天做了一道八數碼,完全沒有bfs的思路,還是請大佬點通了以下,才知道這跟bfs沒有什麼區別 之所以要把難題劃掉,是因為發現這根本是一道水題,對,沒錯,沒有你想的那麼難 首先給你的乙個數,就是八數碼的排列,也就是 0 sim8 的全排列,然後你需要搜尋他怎樣移動。然後我們需要判重了,判重的方法有很多...

八數碼難題

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

八數碼難題

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