本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
问题描述:
要求:
算法思想:
代码如下:
* 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;
}
回溯算法 n后问题
精选 转载八皇后问题是大数学家高斯于1850年提出来的。该问题是在8×8的国际象棋棋盘上放置8个皇后,使得没有一个皇后能“吃掉”任何其他一个皇后,即没有任何两个皇后被放置在棋盘的同一行、同一列或同一斜线上。
编一个程序求出该问题的所有解。
回溯法
使用回溯算法求解的问题特征,求解问题要分为若干步,且每一步都有几种可能的选择,而且往往在某个选择不成功时需要回头再试另外一种选择,如果到达求解目标则每一步的选择构成了问题的解,如果回头到第一步且没有新的选择则问题求解失败。
该问题也可扩展到N后问题求解,只需修改程序main函数中的n值即可。
/************************************************************************
上一篇:贪心算法 活动安排问题
下一篇:回溯算法 图m着色问题
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【数据结构】如何解决括号问题?详谈括号问题的算法思想与代码实现
【数据结构】第三章——栈、队列与数组详细介绍栈在括号问题中的应用
C语言 数据结构 栈 括号问题 字符串