首页 > 语言 > 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. var nQueens = []; 
  7. var backTracking = false
  8. rowLoop: 
  9. for (var row=0; row<order; row++) { 
  10. //若出现row小于0, 则说明问题无解 
  11. if(row < 0){ 
  12. console.log('This N Queens problem has no solution ! '); 
  13. break
  14. //第一次检测到新的一行 
  15. if (nQueens[row] === undefined) { 
  16. nQueens[row] = []; 
  17. //回溯时运行的程序块 
  18. for (var col=0; col<order; col++) { 
  19. //0为已经检测过并为能放置皇后的位置 
  20. if (nQueens[row][col] === 0) { 
  21. continue
  22. //回溯过程中,遇到能放皇后的位置,说明这个位置在后面的验证没有通过,需要重新处理 
  23. else if (backTracking && nQueens[row][col] == 1) { 
  24. //回溯时发现,上一行也到行末,需要继续回溯 
  25. if (col === order-1) { 
  26. resetRow(nQueens, order, row); 
  27. row = row - 2; 
  28. continue rowLoop; 
  29. //回溯的行还没到行尾, 标0, 继续 
  30. nQueens[row][col] = 0; 
  31. backTracking = false
  32. continue
  33. //放置一个皇后 
  34. nQueens[row][col] = 1; 
  35. //找到一个可以放置皇后的位置,跳出到下一行(一行上只能放一个皇后)。 
  36. if (isQueenValid(nQueens, row, col)) {  
  37. continue rowLoop; 
  38. //每一行都应该有一个皇后,到列尾了还没有找到合适的位置,说明前面的皇后放置有问题,需要回溯! 
  39. else if (col == order-1) {  
  40. backTracking = true
  41. //0与1都表示这个位置已经检测过,因此要将本行清为undefined 
  42. resetRow(nQueens, order, row); 
  43. //减2是因为循环尾还有个自加,其实就是回到上一行 
  44. row = row - 2; 
  45. //退到外层循环,继续 
  46. continue rowLoop;  
  47. else { 
  48. //未到行未,继续检测未检测过的 
  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. //检测位置是否能放置皇后 
  58. function isQueenValid(nQueens, row, col) { 
  59. //行检测 
  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. // 列检测 左上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); 

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

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

图片精选