思路
- 经典回溯和526以及其他全排列一致
- (符合条件的)可放可不放问题
- 使用
a[hang] = lie
进行标记,a[hang]
可以放置列号1-n
中的任意一个,但是前提是符合不在一行(这个已经利用数组搞定了),不在一列,而且也不在同一斜线
void backtrack(路径,选择列表)
{
if(满足条件){
result.add(路径)||result++;
return;
}
for(选择in选择列表){
做选择;
backtrack(路径,选择列表);
撤销选择;
}
}
#include<stdio.h>
#include<string.h>
#include<math.h>
int canput(int *a,int hang,int lie){
int i;
for(i=1;i<hang;i++){
if(a[i]==lie||abs(hang-i)==abs(lie-a[i])){
return 0;
}
}
return 1;
}
void put(int *a,int hang,int end,int *count){
int i;
if(hang>end){
(*count)++;
return;
}
for(i=1;i<=end;i++){
if(canput(a,hang,i)){
a[hang] = i;
put(a,hang+1,end,count);
a[hang] = -1;
}
}
}
int totalNQueens(int n){
int a[n+1];
memset(a,-1,sizeof(a));
int count=0;
put(a,1,n,&count);
return count;
}
int main(){
int res = totalNQueens(4);
printf("re = %d\n",res);
}