日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

八数码问题II-双向bfs和map标记

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 八数码问题II-双向bfs和map标记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

輸入

輸入初始狀態,一行九個數字,空格用0表示

輸出

只有一行,該行只有一個數字,表示從初始狀態到目標狀態需要的最少移動次數(一定能到達目標狀態)

樣例輸入

283104765

樣例輸出

4

解題思路:
這題與八數碼問題I-bfs和map標記的區別就是輸入方式換了,這樣子輸入,有種情況比如028137465(隨便舉的例子),由于第一個元素是0,所以我們用%去最后面的元素的時候,我們取不到0,所以我們用另外一種方式取,每次取第一個元素,將輸入的數除以100000000,就可以得到第一個元素,然后%10得到就好了。

然后,這題我們用雙向bfs寫!

代碼如下:

#include <iostream> #include <queue> #include <map> using namespace std; map<int, int>dis; map<int, int>vis; int e = 123804765; int n; int mp[4][4]; int ans;int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0}; int r, c;void fff1(int t) {int div = 100000000;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {mp[i][j] = (t / div) % 10;if (mp[i][j] == 0) {r = i;c = j;}div = div / 10;} }int fff2() {int tmp = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {tmp = tmp * 10 + mp[i][j];}return tmp; }int dbfs(int s) {vis[s] = 1;//從起點開始搜標記為1vis[e] = 2;//從終點開始搜標記為2dis[s] = 0, dis[e] = 1;//這里終點距離為1,很容易想到是因為什么!想不到可以留言,我來幫你解答queue<int>q1, q2;q1.push(s);q2.push(e);while (q1.size() && q2.size()) {bool flag = 0;int t ;int v;if (q1.size() < q2.size()) {t = q1.front();q1.pop(); // cout << t << endl;flag = 1;} else {t = q2.front();q2.pop(); // cout << t << endl;flag = 0;}fff1(t);for (int i = 0; i < 4; i++) {int xx = r + dx[i], yy = c + dy[i];if (xx >= 0 && xx < 3 && yy >= 0 && yy < 3) {swap(mp[xx][yy], mp[r][c]);v = fff2();if (!dis.count(v)) {dis[v] = dis[t] + 1;vis[v] = vis[t];if (flag)q1.push(v);elseq2.push(v);} else if (vis[v] + vis[t] == 3)//相遇 {ans = dis[v] + dis[t];return ans;}swap(mp[xx][yy], mp[r][c]);}}}return -1; }int main() {cin >> n;cout << dbfs(n) << endl;return 0; }

總結

以上是生活随笔為你收集整理的八数码问题II-双向bfs和map标记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。