您的位置:首页 > 其它

回溯算法 n后问题

2013-01-03 15:41 260 查看
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!

问题描述:

八皇后问题是大数学家高斯于1850年提出来的。该问题是在8×8的国际象棋棋盘上放置8个皇后,使得没有一个皇后能“吃掉”任何其他一个皇后,即没有任何两个皇后被放置在棋盘的同一行、同一列或同一斜线上。

要求:

编一个程序求出该问题的所有解。

算法思想:

回溯法

使用回溯算法求解的问题特征,求解问题要分为若干步,且每一步都有几种可能的选择,而且往往在某个选择不成功时需要回头再试另外一种选择,如果到达求解目标则每一步的选择构成了问题的解,如果回头到第一步且没有新的选择则问题求解失败。

该问题也可扩展到N后问题求解,只需修改程序main函数中的n值即可。

代码如下:


/************************************************************************


* n后问题求解


************************************************************************/




#include <stdio.h>


#include <stdlib.h>


#include <math.h>


#include <conio.h>




#define MAXNUMBER 20




//判断当前得到的解向量是否满足问题的解


bool place_queen(int x[],int k)


{


int i;


for(i=1;i<k;i++)


{


if((x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k)))


return false;


}




return true;


}




//将结果简单信息打印到屏幕


void output_queens(int x[],int n)


{


for(int i=1;i<=n;i++)


printf("%3d",x[i]);




printf(" ");


}




//将结果详细信息写入文件


void output_queens(FILE *fp,int number,int x[],int n)


{


fprintf(fp,"solution %d: ",number);


for(int i=1;i<=n;i++)


{


for(int j=1;j<=n;j++)


{


if(j==x[i])


fprintf(fp,"1 ");


else


fprintf(fp,"0 ");


}


fprintf(fp," ");


}


fprintf(fp," ");


}




/************************************************************************


* n后问题求解


* input : n, the number of queens


* output : the vector of solution, X


************************************************************************/


int n_queens(FILE *fp,int n,int x[])


{


int nCount=0; //解个数


int k=1; //先处理第1个皇后


x[1]=0;




while(k>0)


{


x[k]=x[k]+1;//在当前列加1的位置开始搜索




while(x[k]<=n && !place_queen(x,k)) //当前列位置是否满足条件


x[k]=x[k]+1; //不满足,继续搜索下一列位置




if(x[k]<=n) //若存在满足条件的列


{


if(k==n)//是最后一个皇后,则得到一个最终解


{


//break; //此处若break,则只能得到一个解


nCount++;


output_queens(x,n); //输出


output_queens(fp,nCount,x,n);


}


else //否则,处理下一个皇后,即第 k+1 个皇后


{


k++;


x[k]=0;


}


}


else //若不存在满足条件的列,则回溯


{


x[k]=0; //第k个皇后复位为0


k--; //回溯到前一个皇后


}


}




return nCount;


}




int main()


{


int n=8,x[MAXNUMBER]={0};




FILE *fp=fopen("8皇后问题的解.txt","w");


if(fp==NULL)


{


printf("can not wirte file!");


exit(0);


}




printf("the queens are placed on the coloums : ");


//求解并写入文件


int nCount=n_queens(fp,n,x);


printf("there are %d solutions! ",nCount);


fclose(fp);


getch();




return 0;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息