問題描述:
在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的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...