八數碼問題是乙個經典的bfs問題,把棋局看成乙個狀態圖,共有9!種狀態。從初始棋局開始,每次轉移到下個狀態,直到目標棋局為止。
仔細分析可知,八數碼的關鍵是判重,如果不去除重複狀態,程式會產生很多無效狀態,從而複雜度大大增加
bfs + cantor
(0表示空格所在位置)
初始棋局:
|1|2|3|
|0|8|4|
|7|6|5|
目標棋局:
|1|0|3|
|8|2|4|
|7|6|5|
1.先將空格和8交換得到:
|1|2|3|
|8|0|4|
|7|6|5|
2.再將空格和2交換得到目標棋局:
|1|0|3|
|8|2|4|
|7|6|5|
總共執行兩次操作
#include
using
namespace std;
const
int len =
362880
;// 共9!種狀態
struct node
;int dir[4]
[2]=
,,,,
};int visited[len]=;
// cantor判重,若某狀態訪問過置為一
int start[9]
;int goal[9]
;long factory=
;// cantor判重用到的常數,從0!到9!
bool
cantor
(int str,
int n)if(
!visited[result]
)else
return
false;}
intbfs()
}}return-1
;//沒找到
}int
main()
C STL解決八數碼問題
先放原始碼 大部分借鑑了書本的 隨後對部分 進行解釋 include include include define len 362880 using namespace std 八數碼問題 struct node int dir 4 2 int vis len long int factory in...
用最簡單的方法解決八數碼問題
在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 1.需要定義三個陣列 2.狀態轉移 每次只能像上下左右四個方向移動一格 轉移後狀態陣列與前乙個陣列只有兩個元素不同為方便程式處理給移動方向進行編碼定義兩個陣列 dx dy 方向...
簡單的八數碼問題(BFS)
時間限制 1 sec 記憶體限制 256 mb 提交 9 解決 7 提交 狀態 討論版 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態...