代码:
(思路都在注释里)
int num1(int n) {
if (n < 1)
return 0;
int* record = new int[n];//record[i]表示第i行放在record[i]列
return process1(0, record, n);
}
//i表示现在来到第i行 record表示0到i-1行放的皇后的位置,n表示整体有多少行
//返回值是摆完所有的皇后有多少种
int process1(int i, int record[], int n) {
if (i == n)//不是最后一行,而是最后一行的下一行
return 1;
int res = 0;
for (int j = 0;j < n;j++) {//当前行永远在i行,j表示列的意思
//第i行的皇后,放在了j列,判断会不会和前i-1行的皇后同行同列
if (isValid(record, i, j)) {
record[i] = j;
res += process1(i + 1, record, n);
}
}
return res;
}
//只判断是否与前i-1行是否共列共线就行
bool isValid(int record[], int i, int j) {
for (int k = 0;k < i;k++) {
if (j == record[k] || fabs(record[k] - j) == fabs(k - i))
return false;
}
return true;
}