同時把開始和結束狀態放入佇列搜尋,用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來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題...