八數碼問題是乙個經典的人工智慧問題。具體問題不累述了。
思路:由於存在多組測試資料,可以考慮「打表法「。所謂打表法,即列舉所有的初始情況,記錄其到達終點的路徑。而在這個題目中,順序打表會呼叫很多次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 ...