八數碼問題I bfs和map標記

2021-10-22 13:18:47 字數 1103 閱讀 3769

解題思路:

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

**如下:

#include

#include

#include

using

namespace std;

const

int n =4;

int mp[n]

[n];

map<

int,

int>vis;

map<

int,

int>step;

int dx=

,dy=

;//上 右 下 左

int r,c;

//row,col

bool

move_can

(int u,

int d)

//判斷空格能不能走}if

((d==

0&& r==0)

||(d==

1&& c==2)

||(d==

2&& r==2)

||(d==

3&& c==0)

)return

false

;//我們控制空格移動,如果空格越界就return false

return

true;}

intmove_to

(int u,

int d)

//進行空格交換,然後標記

return tmp;

}int

bfs(

int u)}}

}return-1

;}intmain()

cout<<

bfs(state)

<

return0;

}

讓我們看看如果換一種輸入方式,要怎麼寫呢?

八數碼問題ii-bfs和map標記

八數碼問題II bfs和map標記

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

八數碼問題

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