当前位置:   article > 正文

学习笔记--N皇后(java)_java计算n皇后摆法数量

java计算n皇后摆法数量

N皇后问题
N皇后问题是值在N*N的棋盘上要摆N个皇后
要求任何两个皇后不同行,不同列,也不在同一条斜线上
返回摆法的种类

限制行,让每一行只能摆一个元素
用一个数组来表示放的位置,record[0...i-1]
比如record[0]=7代表0行的元素放在了7列,也就是说下标表示行,值表示列
当到达终止行时返回,
如果没有到终止位置假设当前在第i行,
递归尝试所有的列
如果可以摆的话就继续递归,如果不是,则认为无效
怎么验证可以摆哪?

 

  1. public static int num(int n) {
  2. if(n<1) return 0;
  3. int []record=new int[n];
  4. return process1(0,record,n);
  5. }
  6. //n表示结束位置
  7. //record[0..i-1]表示之前的行,放了皇后的位置
  8. //i是多少行
  9. public static int process1(int i,int []record,int n) {
  10. if(i==n) return 1;//终结行
  11. //没到终结位置,还有皇后要摆
  12. int res=0;
  13. for(int j=0;j<n;j++) { //当前行在i行,尝试i行所有的列 j
  14. //当前第i行的皇后,放在j列,会不会和之前(0..i-1)的皇后,不共行共列或者共斜线
  15. if(isValid(record,i,j)) {
  16. record[i]=j;
  17. res+=process1(i+1,record,n);
  18. }
  19. }
  20. return res;
  21. }
  22. //返回i行皇后,放在j列,是否有效
  23. public static boolean isValid(int []record,int i,int j) {
  24. for(int k=0;k<i;k++) {//之前的某个k行的皇后
  25. if(j==record[k] || Math.abs(record[k]-j) == Math.abs(i-k)) {
  26. return false;
  27. }
  28. }
  29. return true;
  30. }
  31. public static void main(String[] args) {
  32. System.out.println(num(8));
  33. }

结果:92

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

闽ICP备14008679号