八皇后问题总结
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
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
相关文章推荐
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
- 八皇后问题自我总结
- 汉诺塔问题的简单理解和总结
- PHP初学者头疼问题总结
- 携程在线风控系统的架构解析和问题总结
- Qt学习(三)---------常见问题总结
- Ubuntu 14.10 下Hadoop代码编译问题总结
- 总结基于ArcGIS Server 9.2 .Net ADF的WebGIS项目部署问题
- 1.storm问题总结 Could not find leader nimbus from seed hosts [localhost] Did you specify a valid list of
- java中相对路径,绝对路径问题总结
- 1.storm问题总结 Could not find leader nimbus from seed hosts [localhost] Did you specify a valid list of
- CSS-垂直|水平居中问题的解决方法总结
- 整合ssh项目时所遇到的问题总结
- 创业中遇到的问题总结
- 《信息安全系统设计基础》第二周问题总结
- 硬盘分区、系统引导等基本问题的总结
- 关于asp.net Session丢失问题的总结
- 递归和分治思想4|八皇后问题 - 数据结构和算法34
- JAVA问题总结之22--Arraylist集合的操作
- jquery中的几个问题总结