算法-八皇后(最容易理解代码量最小)

 


public class TestEightQueen {
public static void main(String[] args) {
     TestEightQueen queen = new TestEightQueen();
      queen.getCount(0);
}

     int num = 0;
     int maxqueen = 8;
      // 每一种可能性最终结果。假如是 0 3 5 7 4 6 8 2 即第一列一 行 二列三行 ……
     int[] cols = new int[maxqueen];

     /**
     * 从0列开始 0,1,2,3列
     *
     * @param i
     */
     private void getCount(int n) {
           // 第n列0-7行 哪一行可以放皇后
          boolean[] rows = new boolean[maxqueen];
          for (int m = 0; m < n; m++) {
             //每一列的位置,相对于之前的列只有三种情况下某些位置不可以放皇后
            //第一种:同一行 cols[m]就是n之前从0开始已经放了皇后的位置
            rows[cols[m]]=true;
            //第二种情况正向斜对角(左上到右下) 右侧的行数就是cols[m]+d
            //距离cols[m] 1行 就是1正好是列之差,即1=n-m; 距离两行就是n-m=2 所以d=n-m . 假如cols[m]=5 右下1是6 ;右下2是7 ;右下3是8,不存在
            int d=n-m;
           if(cols[m]+d<=maxqueen-1){
                rows[cols[m]+d]=true;
            }
         //第二种情况反向斜对角 (右上到左下) 左侧的行数 cols[m]-d
         //距离cols[m] 1行的右上位置是,右上一,即1=n-m;所以d=n-m . 假如cols[m]=5 右上1是4 ; 右上2是3;右上3是2
         if(cols[m]-d>=0){
            rows[cols[m]-d]=true;
           }
    }
           //上面知道了每n列,即每一列,哪几行不能放置皇后 ,下面开始找皇后具体是第几行
          for (int i = 0; i < maxqueen; i++) {
               if (rows[i]) {
            // true不放行,表示该列第i行不能放皇后,循环的后续不执行使用continue
               continue;
            }
             //若该列第i行为false,下面继续执行,说明可以放皇后
           cols[n] = i;//说明该列已经放置的皇后,但是7-i行还可以放皇后
             if (n < maxqueen - 1) {
                  getCount(n + 1);
             } else {
            //n+1>=7时,说明0到7列已经放置了皇后
               num++;
              //打印
             print();
         }
    }
}

private void print() {
         System.out.println("第"+num+"种方案");
            for (int i = 0; i < maxqueen; i++) {
                for (int j = 0; j < maxqueen; j++) {
                       if(i==cols[j]){
                           System.out.print("0");
                       }else{
                            System.out.print("+");
                    }
               }
              System.out.println(" ");
         }

   }
}

 

posted @ 2020-04-09 22:36  雪辞妹  阅读(242)  评论(0)    收藏  举报