package com.cai.learn.math; /** * 8皇后问题运算(回溯算法) * 思路:1.第一个皇后放在第一行,第一列 * 2.第二行皇后放在第二行第一列,然后判断是否OK,如不OK,继续放在第二列,第三列....第8列,找个一个合适的位置 * 3.继续第三个皇后..... * 4.得到一个正确的时候,在栈回退到上一个栈时,就会开始回溯。即第一个皇后第一列时得到所有正确的解 * 5.然后回头把第一个皇后放在第二列,第三列...第8列 得出所有正确解 */ public class EightQueen { public static int count = 0; public static void main(String[] args) { //用数组存放 每行所在的位置 int[] array = new int[8]; getResult(array,0); System.out.printf("一共有%d种算法",count);//一共有92种算法 } public static void getResult(int[] array,int n){ if(n==8){ count++; for (int i = 0; i < 8; i++) { System.out.print(array[i]+" "); } System.out.println(); return; } //8列,第1列。第2列....第8列 for (int i = 0; i < 8; i++) { array[n] = i; if(isRight(array,n)){ getResult(array,n+1); } } } /** * 判断第n行的位置是否正确 * @param arr 已经排列的位置 * @param i 第几行(i可能是0) * @return */ public static boolean isRight(int[] arr,int i){ for (int k = 0; k < i; k++) { //同一列,同一斜线上为false if (arr[k]==arr[i]||Math.abs(i-k)==Math.abs(arr[i]-arr[k])){ return false; } } return true; } }