思路:1.judge函数用来对八皇后摆放位置进行正确性检验,检验目标为左右对角线与行,注意要从当前位置的前面开始检验
2.backtrcking函数用来回溯与摆放位置,内置的for循环用来对每一行的每一列进行皇后填充,填充后对填充合法性进行检验,如果正确进入下一行,注意在填充后无论正误进行回溯修改
3循环控制条件为~scanf,它对scanf返回的值进行取反,若scanf读取非法输入,终止程序
#include<stdio.h>
int judge(int matrix[][10], int n, int row, int col) {
if(row==0) return 1;
// 检查行
for (int i = row-1; i>=0; i--) {
if (matrix[i][col] == 1) return 0;
}
// 检查左上对角线
for (int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) {
if(j==-1) break;
if (matrix[i][j] == 1) return 0;
}
// 检查右上对角线
for (int i = row-1, j = col+1; i >= 0 && j < n; i--, j++) {
if(j==n) break;
if (matrix[i][j] == 1) return 0;
}
return 1; // 没有冲突
}
void backtracking(int n,int row,int matrix[][10],int*ptr){
if(row==n){
(*ptr)++;
return;
}
else{
for(int i=0;i<n;i++){
matrix[row][i]=1;//在row行的每一列放置皇后
if(judge(matrix,n,row,i)){
backtracking(n,row+1,matrix,ptr);
}
matrix[row][i]=0;//回溯修改
}
}
}
int n_queens(int n){
int matrix[10][10]={0};
int count=0;
int*ptr=&count;
backtracking(n,0,matrix,ptr);
return count;
}
int main(){
int n;
while(~scanf("%d", &n)){
int result=n_queens(n);
printf("%d\n",result);
}
return 0;
}
注意:对count值的修改要用指针,单纯传count不会修改count的值,犯这种错误我真的哭死qaq