您的位置:首页 > 其它

八皇后问题(一)

2017-08-03 22:09 197 查看
//八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。

//该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:

//在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,

//即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。

//1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
//计算机发明后,有多种计算机语言可以解决此问题

#include <stdio.h>
#include <math.h>
int iCount = 0;   //记录解的序列号
int Queens[8];    //记录皇后在各列上的位置
void Output()     //输出
{
int i, j, flag=1;
printf("第%2d种方案,(★代表皇后):\n",++iCount);
printf("  ");

for (i = 1; i <= 8; i++)
printf("▁");
printf("\n");
for (i = 0; i < 8; i++)
{
printf(" |");
for (j = 0; j < 8; j++)
{
if (Queens[i] - 1 == j)  //确定该位置是否为皇后
printf("★");
else
{
if (flag < 0)
printf("  ");
else
printf("■");
}
flag = -1 * flag;
}
printf("| \n");
flag = -1 * flag;
}
printf("  ");
for (i = 1; i <= 8; i++)
printf("▔");
printf("\n");
getchar();
}
int IsValid(int n)  //判断皇后是否形成攻击
{
int i;
for (i = 0; i < n; i++)        //第n个皇后与 前面的n-1个比较
{
if (Queens
== Queens[i])  //判断两个皇后是否在同一行上
return 0;
if (abs(Queens
- Queens[i]) == n - i)  //判断两个皇后是否在同一对角线上
return 0;
}
return 1;   //没有冲突
}
void Queen(int n)  //第n列放置皇后
{
int i = 8;
if (n == 8)      //放置成功
{
Output();    //输出
return;
}
for (i = 1; i <= 8; i++)  //在第n列的8行上进行探索
{
Queens
= i;       //在该列上第i行上放置皇后
if (IsValid(n))      //没有冲突返回1,就开始下一步试探
Queen(n + 1);  //没有冲突进行下一步递归
}
}
int main()
{
printf("八皇后的排序方案:\n");
Queen(0); //从第0列开始
getchar();
return 0;
}

运行结果

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