当前位置:   article > 正文

回溯法解决N皇后问题-java_java回溯法实现4皇后问题

java回溯法实现4皇后问题

参照LeetCode第51题的题干,N皇后是指将N个皇后放置在NXN的棋盘上,并且皇后之间不可以互相攻击,即其中任意两个皇后不能在同一行、同一列或者同一条斜线上。

四皇后的放置情况示例如下:

采用回溯法解决该问题时需要将搜索过程抽象成一颗树,只要搜索到达了树的叶子节点,则等于找到了所有皇后合理的放置位置。

其中三皇后问题的解决思路如下,注意三皇后是无解的:

将整个棋盘抽象为坐标轴,按照从上到下的顺序放置皇后,每一行放置一个后即可进行下一行的放置,过程如图:

 对应的Java代码如下:

  1. //输入棋盘边长n,返回所有合法的放置位置
  2. public List<List<String>> solveNQueens(int n)
  3. {
  4. //题目要求使用二维字符串数组返回
  5. List<List<String>> res = new ArrayList<>();
  6. LinkedList<List<String>> board = new LinkedList<>();
  7. backtrack(res,board,0,n);
  8. return res;
  9. }
  10. //按照题目要求初始化每行
  11. public List<String> initList(int n)
  12. {
  13. List<String> temp = new ArrayList<>();
  14. for(int j=0;j<n;j++)
  15. {
  16. temp.add(".");
  17. }
  18. return temp;
  19. }
  20. //处理返回结果为题目要求的样式
  21. public List<String> convertBoard(LinkedList<List<String>> board)
  22. {
  23. List<String> res = new ArrayList<>();
  24. for(int i=0;i<board.size();++i)
  25. {
  26. String temp = String.join("",board.get(i));
  27. res.add(temp);
  28. }
  29. return res;
  30. }
  31. //回溯方法
  32. public void backtrack(List<List<String>> res,LinkedList<List<String>> board,int y,int n)
  33. {
  34. if(board.size()>=n||y>=n)
  35. {
  36. res.add(convertBoard(board));
  37. return;
  38. }
  39. for(int i=0;i<n;++i)
  40. {
  41. //假如当前位置不合法,剪枝
  42. if(!isValid(board,i,y,n))
  43. continue;
  44. //当前位置可以放置
  45. List<String> yList = initList(n);
  46. yList.set(i,"Q");
  47. board.add(yList);
  48. //处理下一行
  49. backtrack(res,board,y+1,n);
  50. //取消选择
  51. board.removeLast();
  52. }
  53. }
  54. public boolean isValid(LinkedList<List<String>> board,int x,int y,int n)
  55. {
  56. //检查上方是否有冲突
  57. for(int i=0;i<y;++i)
  58. {
  59. if(board.get(i).get(x).equals("Q"))
  60. return false;
  61. }
  62. //检查右上方是否有冲突
  63. for(int i=x+1,j=y-1;i<n&&j>=0;i++,j--)
  64. {
  65. if(board.get(j).get(i).equals("Q"))
  66. return false;
  67. }
  68. //检查左上方是否有冲突
  69. for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--)
  70. {
  71. if(board.get(j).get(i).equals("Q"))
  72. return false;
  73. }
  74. return true;
  75. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/633290
推荐阅读
相关标签
  

闽ICP备14008679号