js使用遞迴回溯法解八皇后問題程式碼分享
下面分享一段程式碼例項,它使用遞迴回溯法解八皇后問題。
當然程式碼是來自於網路,感興趣的朋友可以做一下參考,程式碼如下:
[JavaScript] 純文字檢視 複製程式碼function NQueens(order) { if (order < 4) { console.log('N Queens problem apply for order bigger than 3 ! '); return; } var nQueens = []; var backTracking = false; rowLoop: for (var row=0; row<order; row++) { //若出現row小於0, 則說明問題無解 if(row < 0){ console.log('This N Queens problem has no solution ! '); break; } //第一次檢測到新的一行 if (nQueens[row] === undefined) { nQueens[row] = []; } //回溯時執行的程式塊 for (var col=0; col<order; col++) { //0為已經檢測過併為能放置皇后的位置 if (nQueens[row][col] === 0) { continue; } //回溯過程中,遇到能放皇后的位置,說明這個位置在後面的驗證沒有通過,需要重新處理 else if (backTracking && nQueens[row][col] == 1) { //回溯時發現,上一行也到行末,需要繼續回溯 if (col === order-1) { resetRow(nQueens, order, row); row = row - 2; continue rowLoop; } //回溯的行還沒到行尾, 標0, 繼續 nQueens[row][col] = 0; backTracking = false; continue; } //放置一個皇后 nQueens[row][col] = 1; //找到一個可以放置皇后的位置,跳出到下一行(一行上只能放一個皇后)。 if (isQueenValid(nQueens, row, col)) { continue rowLoop; } //每一行都應該有一個皇后,到列尾了還沒有找到合適的位置,說明前面的皇后放置有問題,需要回溯! else if (col == order-1) { backTracking = true; //0與1都表示這個位置已經檢測過,因此要將本行清為undefined resetRow(nQueens, order, row); //減2是因為迴圈尾還有個自加,其實就是回到上一行 row = row - 2; //退到外層迴圈,繼續 continue rowLoop; } else { //未到行未,繼續檢測未檢測過的 nQueens[row][col] = 0; continue; }; } } return nQueens; } //回溯前, 將本行清除 function resetRow(nQueens, order, row) { for (var col=0; col<order; col++) { nQueens[row][col] = undefined; } } //檢測位置是否能放置皇后 function isQueenValid(nQueens, row, col) { //行檢測 for (var i=0; i<col; i++) { if (nQueens[row][i] == 1) { return false; } } for (var j=1; j<row+1; j++) { // 列檢測 左上45度 右上45度 if (nQueens[row-j][col]==1 || (nQueens[row-j][col-j]==1) || (nQueens[row-j][col+j]==1)) { return false; } } return true; } function printQ(queens) { for (var row=0; row<queens.length; row++) { var rowText = ''; for (var col=0; col<queens.length; col++) { if (queens[row][col]===undefined) { queens[row][col] = 0; } rowText = rowText + queens[row][col] + ' '; } console.log(rowText); } } var queens = NQueens(8); printQ(queens);
相關文章
- 回溯法(排列樹)解決八(N)皇后問題
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- 從八皇后問題到回溯演算法演算法
- C#資料結構與演算法系列(十四):遞迴——八皇后問題(回溯演算法)C#資料結構演算法遞迴
- 遞迴與回溯法遞迴
- Python 八皇后解法(非遞迴版本)Python遞迴
- c++迷宮問題回溯法遞迴演算法C++遞迴演算法
- 八皇后問題的錯誤程式碼示範
- n皇后問題--回溯法,以DFS的方式搜尋
- 洛谷八皇后問題
- 八皇后問題python解法Python
- 遞迴加回溯遞迴
- 回溯演算法 | 追憶那些年曾難倒我們的八皇后問題演算法
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.3 題解:機器人走方格問題遞迴機器人
- 八皇后問題分析和實現
- 遞迴回溯相關遞迴
- 7-22 n queens (10分) 八皇后(n皇后)問題
- 「演算法之美系列」遞迴與回溯(JS版)演算法遞迴JS
- 回溯法解決全排列問題總結
- 遞迴問題遞迴
- 遞迴解決全排列問題遞迴
- 回溯法求迷宮問題
- 《演算法》系列—大白話聊分治、回溯,手撕八皇后演算法
- 遞迴-*全排列問題遞迴
- 遞迴路徑問題遞迴
- js遞迴遍歷講解JS遞迴
- N皇后問題
- 【力扣】排列問題(回溯法)(去重)力扣
- python3:遞迴解漢諾塔問題Python遞迴
- python八皇后Python
- 回溯問題
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- 樹遞迴問題的求解遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 遞迴求解漢諾塔問題遞迴
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.5 “逐步生成結果”之非數值型問題 (合法括號)遞迴