由于8个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占据一行。定义一个数组columnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。先把数组columnIndex的8个数字分别用0~7初始化,接下来就是对数组columnIndex做全排列。因为用不同的数字初始化数组,所以任意两个皇后肯定不同列。只需要判断每一个排列对应的8个皇后是不是同一个对角线上,也就是对于数组的两个下标i和j,是不是i-j==columnIndex[i]-columnIndex[j]或者j-i==columnIndex[i]-columnIndex[j]。

代码实现:

public class Solution{
    public static void putQueen(int[] queen,int begin){
          if(queen==null||queen.length==0){
              return;
          }
          if(queen.length==begin){
              boolean flag=true;
              //判断8个皇后是否在同一对角线上
              for(int i=0;i<queen.length;i++){
                    for(int j=i+1;j<queen.length;j++){
                         if((i-j==queen[i]-queen[j])||(j-i==queen[i]-queen[j])){
                               flag=false;
                               break;
                         }
                    }
                    if(!flag){
                         break;
                    }
              }
              //如果任意两个皇后都不在同一对角线上,则输出该结果
              if(flag){
                    for(int x:queen){
                         System.out.print(x+" ");
                    }
                    System.out.println();
              }
          }else{
               //数组全排列
               for(int i=begin;i<queen.length;i++){
                    swap(queen,begin,i);
                    putQueen(queen,begin+1);
                    swap(queen,begin,i);
               }
          }
    }

    public static void swap(int[] array,int i,int j){
           int temp=array[i];
           array[i]=array[j];
           array[j]=temp;
    }

    public static void main(String[] args){
         int[] columnIndex=new int[8];
         for(int i=0;i<columnIndex.length;i++){
              columnIndex[i]=i;
         }
         putQueen(columnIndex,0);
    }
}

 

 posted on 2018-11-13 21:22  会飞的金鱼  阅读(84)  评论(0)    收藏  举报