您的位置:首页 > 其它

八皇后问题总结

2018-03-10 09:25 288 查看
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.csdn.net/Dora_Bin/article/details/52733832?locationNum=7 http://blog.csdn.net/u011200844/article/details/43452385 https://www.cnblogs.com/xinghuan/p/6061824.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c