首页 > 语言 > JavaScript > 正文

javascript递归回溯法解八皇后问题

2024-05-06 16:18:41
字体:大 中 小
来源:转载
供稿:网友

网上看到许多关于八皇后算法的文章,很少能看到使用javascript来实现的,今天就给大家使用javascript来解决下这个问题,有需要的小伙伴可以参考下。

下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了。

 

 
  1. function NQueens(order) { 
  2. if (order < 4) { 
  3. console.log('N Queens problem apply for order bigger than 3 ! '); 
  4. return; 
  5. } 
  6.  
  7. var nQueens = []; 
  8. var backTracking = false; 
  9. rowLoop: 
  10. for (var row=0; row<order; row++) { 
  11. //若出现row小于0, 则说明问题无解 
  12. if(row < 0){ 
  13. console.log('This N Queens problem has no solution ! '); 
  14. break; 
  15. } 
  16. //第一次检测到新的一行 
  17. if (nQueens[row] === undefined) { 
  18. nQueens[row] = []; 
  19. } 
  20. //回溯时运行的程序块 
  21. for (var col=0; col<order; col++) { 
  22. //0为已经检测过并为能放置皇后的位置 
  23. if (nQueens[row][col] === 0) { 
  24. continue; 
  25. } 
  26. //回溯过程中,遇到能放皇后的位置,说明这个位置在后面的验证没有通过,需要重新处理 
  27. else if (backTracking && nQueens[row][col] == 1) { 
  28. //回溯时发现,上一行也到行末,需要继续回溯 
  29. if (col === order-1) { 
  30. resetRow(nQueens, order, row); 
  31. row = row - 2; 
  32. continue rowLoop; 
  33. } 
  34. //回溯的行还没到行尾, 标0, 继续 
  35. nQueens[row][col] = 0; 
  36. backTracking = false; 
  37. continue; 
  38. } 
  39. //放置一个皇后 
  40. nQueens[row][col] = 1; 
  41. //找到一个可以放置皇后的位置,跳出到下一行(一行上只能放一个皇后)。 
  42. if (isQueenValid(nQueens, row, col)) {  
  43. continue rowLoop; 
  44. } 
  45. //每一行都应该有一个皇后,到列尾了还没有找到合适的位置,说明前面的皇后放置有问题,需要回溯! 
  46. else if (col == order-1) {  
  47. backTracking = true; 
  48. //0与1都表示这个位置已经检测过,因此要将本行清为undefined 
  49. resetRow(nQueens, order, row); 
  50. //减2是因为循环尾还有个自加,其实就是回到上一行 
  51. row = row - 2; 
  52. //退到外层循环,继续 
  53. continue rowLoop;  
  54. } else { 
  55. //未到行未,继续检测未检测过的 
  56. nQueens[row][col] = 0;  
  57. continue; 
  58. }; 
  59. } 
  60. } 
  61. return nQueens; 
  62. } 
  63. //回溯前, 将本行清除 
  64. function resetRow(nQueens, order, row) { 
  65. for (var col=0; col<order; col++) { 
  66. nQueens[row][col] = undefined; 
  67. } 
  68. } 
  69. //检测位置是否能放置皇后 
  70. function isQueenValid(nQueens, row, col) { 
  71. //行检测 
  72. for (var i=0; i<col; i++) { 
  73. if (nQueens[row][i] == 1) { 
  74. return false; 
  75. } 
  76. } 
  77. for (var j=1; j<row+1; j++) { 
  78. // 列检测 左上45度 右上45度 
  79. if (nQueens[row-j][col]==1 || (nQueens[row-j][col-j]==1) || (nQueens[row-j][col+j]==1)) { 
  80. return false; 
  81. } 
  82. } 
  83. return true; 
  84. } 
  85.  
  86. function printQ(queens) { 
  87. for (var row=0; row<queens.length; row++) { 
  88. var rowText = ''; 
  89. for (var col=0; col<queens.length; col++) { 
  90. if (queens[row][col]===undefined) { 
  91. queens[row][col] = 0; 
  92. } 
  93. rowText = rowText + queens[row][col] + ' '; 
  94. } 
  95. console.log(rowText); 
  96. } 
  97. } 
  98.  
  99. var queens = NQueens(8); 
  100. printQ(queens); 

以上就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选