当前位置:   article > 正文

9.9递归和动态规划(九)——N皇后_九皇后动态规划

九皇后动态规划
/**
 * 功能:打印八皇后在8*8棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。
 * 这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

 */


  1. static int GRID_SIZE=8;
  2. /**
  3. * 思路:每一行只能摆放一个皇后,因此不需要将棋盘存储为完整的8*8矩阵,只需一维数组,其中columns[r]=c表示有个皇后位于r行c列。
  4. * @param row
  5. * @param columns
  6. * @param results
  7. */
  8. public static void placeQueen(int row,Integer[] columns,ArrayList<Integer[]> results){
  9. if(row==GRID_SIZE){
  10. /*Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object.
  11. * The general intent is that, for any object x, the expression:
  12. x.clone() != x will be true.
  13. * and that the expression:
  14. x.clone().getClass() == x.getClass() will be true.
  15. * but these are not absolute requirements. While it is typically the case that:
  16. x.clone().equals(x) will be true, this is not an absolute requirement. */
  17. results.add(columns.clone());
  18. }else{
  19. for(int col=0;col<GRID_SIZE;col++){
  20. if(checkValid(columns,row,col)){
  21. columns[row]=col;//摆放皇后
  22. placeQueen(row+1, columns, results);
  23. }
  24. }
  25. }
  26. }
  27. /**
  28. * 检查(row,column)是否可以摆放皇后,方法:
  29. * 检查有无其他皇后位于同一列或对角线,不必检查是否在同一行上,因为调用placeQueen时,一次只会摆放一个皇后。由此可知,这一行是空的。
  30. * @param columns
  31. * @param row
  32. * @param column
  33. * @return
  34. */
  35. public static boolean checkValid(Integer[] columns,int row,int column){
  36. for(int r=0;r<row;r++){
  37. int c=columns[r];
  38. /* 检查同一列是否有皇后 */
  39. if(c==column)
  40. return false;
  41. /* 检查对角线:
  42. * 若两行的距离等于两列的距离,则表示两个皇后在同一对角线上。
  43. */
  44. int columnDistance=Math.abs(c-column);
  45. int rowDistance=row-r;//row>r,不用取绝对值
  46. if(columnDistance==rowDistance)
  47. return false;
  48. }
  49. return true;
  50. }


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

闽ICP备14008679号