实验一,八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

    请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。

public class bahuanghou {
 private int[] column;
 private int[] rTol;//右上至左下是否有皇后
 private int[] lTor;//左上至右下是否有皇后
 private int[] queen;//解答
 private int num;//解答的编号
 
 public bahuanghou() {
  column = new int[8+1];
  rTol = new int[2*8+1];
  lTor = new int[2*8+1];
  for(int i=1;i<=8;i++) 
   column[i] = 1;
   for(int i=1;i<=2*8;i++) 
    rTol[i] = lTor[i] = 1;
    queen = new int[8+1];
  
 }
 
 public void backTrack(int i) {
  if(i>8) {
   showAnswer();
  } else {
   for(int j=1;j<=8;j++) {
    if(column[j] == 1 && rTol[i+j] ==1 && lTor[i-j+8] == 1) {
     queen[i] = j;//设定为占用
     column[j] = rTol[i+j] = lTor[i-j+8] = 0;
     backTrack(i+1);
     column[j] = rTol[i+j] = lTor[i-j+8] = 1;
    }
   }
  }
 }
 
 protected void showAnswer() {
  num ++;
  System.out.println("\n解答" + num);
  for(int y=1;y<=8;y++) {
   for(int x = 1;x<=8;x++) {
    if(queen[y] == x) {
     System.out.print(" Q");
    }else {
     System.out.print(" X");
    }
   }
   System.out.println();
  }
 }
 
 public static void main(String [] args) {
  bahuanghou queen = new bahuanghou();
  queen.backTrack(1);
 }

}


实验一,八皇后问题_第1张图片

 

你可能感兴趣的:(实验一,八皇后问题)