您的位置:首页 > 编程语言 > C语言/C++

经典问题“八皇后”的解法

2013-04-07 08:19 169 查看
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

#include<stdio.h>
void fun(int i,int j);
static b[8][8];
void main()
{
fun(0,0);

}
int knock(int i,int j)
{int temp_i,temp_j,k;
temp_i=i;temp_j=j;
for(i=i-1;i>=0;i--)
if(b[i][j]==1)
return 1;
for(i=temp_i-1,k=temp_j+1,j=temp_j-1;i>=0;i--,j--,k++)
{if(j>=0&&b[i][j]==1)
return 1;
if(k<8&&b[i][k]==1)
return 1;
}
return 0;
}
void cls(int i)
{int j;
for(;i<8;i++)
{
for(j=0;j<8;j++)
b[i][j]=0;
}

}
void print(void)
{int i,j;static int n=1;
printf("--------------------------\n第%d种\n",n++);
for(j=0;j<8;j++)
{
for(i=0;i<8;i++)
{if(b[i][j]==1)
printf("* ");
else
printf("0 ");
}
printf("\n");

}
printf("\n");//    getchar();
}
void fun(int i,int j)
{if(i<8)
{
for(;j<8;j++)
{cls(i);
if(knock(i,j)==1)
continue;
b[i][j]=1;
fun(i+1,0);
}

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