public class Test50 { //i表示当前来到的行数,record[0……i-1]为已经固定好的皇后位置 //n代表一共有多少行:0到n-1行 //返回多少种摆法 public static int process1(int i, int[] record, int n) { if (i == n) { return 1; } int res = 0; //当前i行的皇后分别放在所有j列上尝试 for (int j = 0; j < n; j++) { //如果record里的所有已经放下的皇后和目前i行j列的皇后不冲突 // 那么就把目前的位置记录进record,并计算后续的情况 if (isValid(record , i , j)) { record[i] = j; res += process1(i + 1, record, n); } } return res; } public static int num1(int n) { if (n < 1) { return 0; } int[] record = new int[n]; return process1(0 , record , n); } public static boolean isValid(int[] record, int i, int j) { for (int k = 0; k < i; k++) { if (j == record[k] || Math.abs(record[k] - j) == Math.abs(i - k)) { //k,record[k] i,j //如果共列共斜线返回false return false; } } return true; } }