在 n×m 棋盤上,將「馬」放置於指定起始格。馬按「日」字移動(8 種可能位移)。需搜索一條路徑,使馬遍歷棋盤所有格子且每格僅到達一次。例如 5×5 棋盤、起始 (3,3) 時,需覆蓋 25 個格子。
從 (x,y) 可達 8 個新位置:
(x+1, y+2) (x+1, y-2) (x-1, y+2) (x-1, y-2) (x+2, y+1) (x+2, y-1) (x-2, y+1) (x-2, y-1)
約束條件:
(文中包含相應 UML 圖片,此處略)
採用修改版經典回溯框架:
bool Search(Location curLoc) {
m_complex++;
m_chessTable[curLoc.x-1][curLoc.y-1] = 1; // 標記已訪問
if (isSuccess()) return true; // 全部覆蓋
for (int i = 0; i < 8; i++) {
Location next = GetSubTreeNode(curLoc, i);
if (isValid(next) && m_chessTable[next.x-1][next.y-1] == 0) {
if (Search(next)) {
MarkInTable(next, curLoc); // 記錄路徑
return true;
}
}
}
m_chessTable[curLoc.x-1][curLoc.y-1] = 0; // 回溯:撤銷標記
return false;
}
| 棋盤 | 起始位置 | 解空間大小 | 結果 |
|---|---|---|---|
| 4×4 | 任意 | 2223 | 無解 |
| 5×5 | (1,1) | 76,497 | 有解 |
| 5×5 | (3,3) | 11,077 | 有解 |
| 6×6 | (4,2) | 2,029,720 | 有解 |
| 7×7 | (3,3) | 12,799,463 | 有解 |
結論:≤5×5 棋盤解空間較小,算法可快速窮盡;8×8 棋盤解空間估計約 276,以 300 萬步/分速度需 128 億年,屬 NP-hard 問題,時間複雜度 O(2n)。
完整源碼請參考附件。