回溯法(traceback)

八皇后问题(EightQueen)

  1. /**
  2. * 算法:回溯法
  3. * 问题:八皇后
  4. * @author win
  5. */
  6. public class EightQueen {
  7. public static int num = 0;//累计方案
  8. public static final int MAXQUEEN = 8;
  9. public static int[] cols = new int[MAXQUEEN];//定义cols数组,表示八列棋子摆放的位置
  10. /***
  11. * @param n 填第n列的皇后
  12. */
  13. public void getCount(int n){
  14. boolean [] rows = new boolean[MAXQUEEN];//记录每列每个方格是否可以放皇后。为true表示不能放
  15. for(int m =0;m<n;m++){
  16. rows[cols[m]] = true;
  17. int d = n - m;//斜对角
  18. //正斜方向
  19. if(cols[m] - d>=0){
  20. rows[cols[m] - d] = true;
  21. }
  22. //反斜方向
  23. if((cols[m]+d)<=MAXQUEEN-1){
  24. rows[cols[m] + d] = true;
  25. }
  26. }
  27. //到此知道了哪些位置不能放皇后
  28. for(int i = 0;i<MAXQUEEN;i++){
  29. if(rows[i]){
  30. //不能放
  31. continue;
  32. }
  33. cols[n] = i;
  34. if(n<MAXQUEEN-1){
  35. getCount(n+1);
  36. }else{
  37. //如果n = MAXQUEEN-1;表示找到了一套完整的方案
  38. num++;
  39. printQueen();
  40. }
  41. //下面可能仍有合法位置
  42. }
  43. }
  44. private void printQueen() {
  45. System.out.println("第"+num+"种方案");
  46. for(int i = 0;i<MAXQUEEN;i++){
  47. for(int j=0;j<MAXQUEEN;j++){
  48. if(i == cols[j]){
  49. System.out.print("0 ");
  50. }else{
  51. System.out.print("+ ");
  52. }
  53. }
  54. System.out.println();
  55. }
  56. }
  57. public static void main(String[] args) {
  58. EightQueen eightQueen = new EightQueen();
  59. eightQueen.getCount(0);
  60. }
  61. }