八數碼問題(一) 暴力BFS STL

2022-05-02 12:03:06 字數 1143 閱讀 9201

八數碼問題是乙個經典的人工智慧問題。具體問題不累述了。

思路:由於存在多組測試資料,可以考慮「打表法「。所謂打表法,即列舉所有的初始情況,記錄其到達終點的路徑。而在這個題目中,順序打表會呼叫很多次bfs,所以我們採用逆序打表,只要呼叫一次bfs。

**如下:

1

/*************map存路徑,set判重,string存狀態*****************/2

/*********************暴力廣搜 + stl *************************

*/3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10

using

namespace

std;

11 mapslu;

12set

visited;

13int dir[4][2] = ,,, };

14string

base = "

udrl";

15char input[1000

];16

struct

node

25};

26bool check(int x, int

y)27

33void

prv_bfs()

3460 q.push(node(h.sta, h.path + base

[i], pos));

61 slu[h.sta] = h.path + base

[i];

62v.insert(h.sta);

63swap(h.sta[h.pos], h.sta[pos]);64}

65}66}

67int

main()

6879

if (slu[line] == "") cout << "

unsolvable

"<80else cout << slu[line] <8283

return0;

8485 }

當然,這一題還有很多很好的方法,我會慢慢補充。

新手入門,希望多多交流!

八數碼問題

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

八數碼問題

八數碼問題 題意 編號為1 8的8個正方形滑塊被擺成3行3列 有乙個格仔留空 如下圖所示 每次可以把與空格相鄰的滑塊 有公共邊才算相鄰 移到空格中,而他原來的位置 就成為了新的空格。如果無法到達目標局面,則輸出 1。2 6 4 13 75 8 移到後 8 1 5 73 642 樣例輸入 2 6 4 ...