国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

javascript遞歸回溯法解八皇后問題

2024-05-06 16:18:41
字體:
供稿:網(wǎng)友

網(wǎng)上看到許多關(guān)于八皇后算法的文章,很少能看到使用javascript來實(shí)現(xiàn)的,今天就給大家使用javascript來解決下這個(gè)問題,有需要的小伙伴可以參考下。

下面給大家分享的是回溯法解八皇后, 帶詳細(xì)注解,這里就不多廢話了。

 

 
  1. function NQueens(order) { 
  2. if (order < 4) { 
  3. console.log('N Queens problem apply for order bigger than 3 ! '); 
  4. return
  5.  
  6. var nQueens = []; 
  7. var backTracking = false
  8. rowLoop: 
  9. for (var row=0; row<order; row++) { 
  10. //若出現(xiàn)row小于0, 則說明問題無(wú)解 
  11. if(row < 0){ 
  12. console.log('This N Queens problem has no solution ! '); 
  13. break
  14. //第一次檢測(cè)到新的一行 
  15. if (nQueens[row] === undefined) { 
  16. nQueens[row] = []; 
  17. //回溯時(shí)運(yùn)行的程序塊 
  18. for (var col=0; col<order; col++) { 
  19. //0為已經(jīng)檢測(cè)過并為能放置皇后的位置 
  20. if (nQueens[row][col] === 0) { 
  21. continue
  22. //回溯過程中,遇到能放皇后的位置,說明這個(gè)位置在后面的驗(yàn)證沒有通過,需要重新處理 
  23. else if (backTracking && nQueens[row][col] == 1) { 
  24. //回溯時(shí)發(fā)現(xiàn),上一行也到行末,需要繼續(xù)回溯 
  25. if (col === order-1) { 
  26. resetRow(nQueens, order, row); 
  27. row = row - 2; 
  28. continue rowLoop; 
  29. //回溯的行還沒到行尾, 標(biāo)0, 繼續(xù) 
  30. nQueens[row][col] = 0; 
  31. backTracking = false
  32. continue
  33. //放置一個(gè)皇后 
  34. nQueens[row][col] = 1; 
  35. //找到一個(gè)可以放置皇后的位置,跳出到下一行(一行上只能放一個(gè)皇后)。 
  36. if (isQueenValid(nQueens, row, col)) {  
  37. continue rowLoop; 
  38. //每一行都應(yīng)該有一個(gè)皇后,到列尾了還沒有找到合適的位置,說明前面的皇后放置有問題,需要回溯! 
  39. else if (col == order-1) {  
  40. backTracking = true
  41. //0與1都表示這個(gè)位置已經(jīng)檢測(cè)過,因此要將本行清為undefined 
  42. resetRow(nQueens, order, row); 
  43. //減2是因?yàn)檠h(huán)尾還有個(gè)自加,其實(shí)就是回到上一行 
  44. row = row - 2; 
  45. //退到外層循環(huán),繼續(xù) 
  46. continue rowLoop;  
  47. else { 
  48. //未到行未,繼續(xù)檢測(cè)未檢測(cè)過的 
  49. nQueens[row][col] = 0;  
  50. continue
  51. }; 
  52. return nQueens; 
  53. //回溯前, 將本行清除 
  54. function resetRow(nQueens, order, row) { 
  55. for (var col=0; col<order; col++) { 
  56. nQueens[row][col] = undefined; 
  57. //檢測(cè)位置是否能放置皇后 
  58. function isQueenValid(nQueens, row, col) { 
  59. //行檢測(cè) 
  60. for (var i=0; i<col; i++) { 
  61. if (nQueens[row][i] == 1) { 
  62. return false
  63. for (var j=1; j<row+1; j++) { 
  64. // 列檢測(cè) 左上45度 右上45度 
  65. if (nQueens[row-j][col]==1 || (nQueens[row-j][col-j]==1) || (nQueens[row-j][col+j]==1)) { 
  66. return false
  67. return true
  68.  
  69. function printQ(queens) { 
  70. for (var row=0; row<queens.length; row++) { 
  71. var rowText = ''
  72. for (var col=0; col<queens.length; col++) { 
  73. if (queens[row][col]===undefined) { 
  74. queens[row][col] = 0; 
  75. rowText = rowText + queens[row][col] + ' '
  76. console.log(rowText); 
  77.  
  78. var queens = NQueens(8); 
  79. printQ(queens); 

以上就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 龙川县| 丹阳市| 临澧县| 阿瓦提县| 永胜县| 文化| 襄樊市| 当雄县| 台安县| 道孚县| 宕昌县| 湘乡市| 龙泉市| 建阳市| 青海省| 洞头县| 布尔津县| 宁乡县| 涿州市| 成武县| 萝北县| 榆中县| 明溪县| 上饶县| 邻水| 怀仁县| 讷河市| 喀喇| 拜城县| 高阳县| 内江市| 青川县| 黄大仙区| 应城市| 肃宁县| 通州市| 东兰县| 巴林左旗| 大庆市| 耿马| 浠水县|