八皇后的后宫战(我是观战打酱油的)

来源:互联网 发布:苹果mac装win7系统好吗 编辑:程序博客网 时间:2024/04/27 14:54
/*高斯在1850年提出:在8X8格的棋盘上摆放八个皇后
 *使其不能互相攻击,即任意两个皇后都不能处于同一
 *行、同一列或同一斜线上,问:共有多少种摆法。
 */

//全局变量
#include <stdio.h>
#include <math.h>


int a[9] = {100};
int count = 0;


//判断第i行第value列放值是否正确
int Place(int i, int value)
{
int j;
if(i == 1)  //第一行先放,所以肯定不会有冲突位置,放哪都合适
return 1;  //直接去告诉长官你找到位置站好了,让他去安排下一行吧
for(j = 1; j < i; j++){
if(a[j] == value)    //循环检测当前行第value列在之前是否在之前有皇后上位过
return 0;
if(abs(i - j) == abs(value - a[j]))  /*还要预防斜线上也有皇后在埋伏你。
  *abs()函数是求绝对值的,但是在这可以
  *用来判断value是否等于以j为基点延出两
  *条对角线至本行相交于两点的值,即value
  *在不在皇后对应点的斜线上.
  */
return 0;
}
return 1;
}


//显示结果
void ShowResult()
{
int i, j;
for(j = 1; j <= 8; j++){
for(i = 1; i < a[j]; i++){
printf("* ");
}
//打印每一行中皇后的位置a[j]
printf("Q");


for(i = i+1; i <= 8; i++){
printf("* ");
}
putchar(10);
}
}


//进行递归回溯
void Backtrack(int t)
{
int i;
//找出一次解,打印图案一次
if(t > 8){
puts("******************************\n");
ShowResult();
count++;
return;
}
else{
for(i = 1; i <= 8; i++){
if(Place(t, i)) //循环判断当前第t行的第i列位置是否合适
{
a[t] = i;  //在当前行找到合适位置后a[行数] = 列数
Backtrack(t + 1);  //继续递归找下一行皇后合适的位置
}
}
}
}


//输出八皇后问题解的个数
void ShowCount()
{
printf("八皇后问题共有%d个解!\n", count);
}


//主函数
void main()
{
Backtrack(1);
ShowCount();
}
原创粉丝点击