本博客(
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)
* 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)