八數碼問題II bfs和map標記

2021-10-22 15:26:42 字數 1243 閱讀 6307

問題描述:

在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:

給出一種初始布局(初始狀態)和目標布局(設目標狀態為123804765),找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。

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

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

樣例輸入

283104765
樣例輸出

4
解題思路:

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

**如下:

#include

#include

#include

using

namespace std;

map<

int,

int>dis;

map<

int,

int>vis;

int e =

123804765

;int n;

int mp[4]

[4];

int ans;

int dx=

, dy=

;int r, c;

void

fff1

(int t)

div = div /10;

}}intfff2()

return tmp;

}int

dbfs

(int s)

else

fff1

(t);

for(

int i =

0; i <

4; i++

)else

if(vis[v]

+ vis[t]==3

)swap

(mp[xx]

[yy]

, mp[r]

[c]);}

}}return-1

;}intmain()

八數碼問題I bfs和map標記

解題思路 bfs,將棋盤轉化成乙個整數表示其狀態,比如我們到到達的狀態是815736402,而樣例給的輸入狀態是264137058,因為這些整數過大,標記陣列開不下,所以可以用map來代替陣列,寫得時候注意些細節。如下 include include include using namespace ...

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟...

八數碼問題

2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 樣例輸出 還有就是重判的問題,如何重判呢?第一種方法 把排列變成整數,然後只開乙個一維陣列,也就是說設計一套排列的編碼和解碼函式,把0 8的全排列和0 362879的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...