3种方法解决:
1、经典递归回溯
#include <stdio.h>
#include <math.h>
int num=0;
int x[8];
int main(){
queen(0);
printf("%d",num);
return 0;
}
void queen(int row){
if(row>=8){
num++;
return ;
}
int j;
for(j=0;j<8;j++){
x[row]=j;
if(B(row,j)){
queen(row+1);
}
}
}
int B(int row,int j){
int k=0;
for(k=0;k<row;k++){
if(x[k]==x[row]||abs(x[row]-x[k])==abs(row-k)){
return 0;
}
}
return 1;
}
2、列、左对角线、右对角线数组
#include <stdio.h>
int row[8];
int ld[15];
int rd[15];
int num;
int main(){
queen(0);
printf("%d",num);
return 0;
}
void queen(int i){
if(i>=8){
num++;
return;
}
int j;
for( j=0;j<8;j++){
int ld1=i+j;
int rd1=j-i+7;
if(row[j]!=1&&ld[ld1]!=1&&rd[rd1]!=1){
row[j]=1;//列
ld[ld1]=1;//左对角线
rd[rd1]=1;//右对角线
queen(i+1);
row[j]=0;
ld[ld1]=0;
rd[rd1]=0;
}
}
}
3、位运算解决
#include<stdio.h>
int uppNum;
int count;
int main(){
uppNum=(1<<8)-1;
queen(0,0,0);
printf("%d\n",count);
}
void queen(int column,int ld,int rd){
if(column==uppNum){
count++;
return;
}
int pos = uppNum&~(column|ld|rd);
while(pos){
int p=pos&-pos;
pos-=p;
queen(column|p,(ld|p)<<1,(rd|p)>>1);
}
}
总结一下,上述都是在codeblocks中运行成功的,最近发现codeblocks编译器和vs不太一样,比如是否可以先输入行列数再构建对应大小的数组,codeblocks中可以,而vs中则是严格要求只能声明大小为常量的数组。
最近编程还发现变量初始化的重要性,一些标志数组不初始化有些情况下就很麻烦。
还有就是循环测试不同数据计数的情况下,也必须要在循环体内初始化,否则也容易出错。
以上总结参考链接:
http://blog.youkuaiyun.com/Dora_Bin/article/details/52733832?locationNum=7
http://blog.youkuaiyun.com/u011200844/article/details/43452385
https://www.cnblogs.com/xinghuan/p/6061824.html