
由于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
浙公网安备 33010602011771号