八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
void Queen()
{
int count=0;
int a[9];
for( a[1]=1;a[1]<=8;a[1]++)
{
for( a[2]=1;a[2]<=8;a[2]++)
{
if(a[1]==a[2]||a[2]==a[1]+1||a[2]==a[1]-1)
continue;
for( a[3]=1;a[3]<=8;a[3]++)
{
if(a[1]==a[3]||a[2]==a[3]||a[3]==a[2]+1||a[3]==a[2]-1||a[3]==a[1]+2||a[3]==a[1]-2)
continue;
for( a[4]=1;a[4]<=8;a[4]++)
{
if(a[1]==a[4]||a[2]==a[4]||a[3]==a[4]||a[4]==a[3]+1||a[4]==a[3]-1||a[4]==a[2]+2||a[4]==a[2]-2
||a[4]==a[1]+3||a[4]==a[1]-3)
continue;
for( a[5]=1;a[5]<=8;a[5]++)
{
if(a[1]==a[5]||a[2]==a[5]||a[3]==a[5]||a[4]==a[5]||a[5]==a[4]+1||a[5]==a[4]-1||a[5]==a[3]+2||a[5]==a[3]-2
||a[5]==a[2]+3||a[5]==a[2]-3 ||a[5]==a[1]+4||a[5]==a[1]-4)
continue;
for( a[6]=1;a[6]<=8;a[6]++)
{
if(a[1]==a[6]||a[2]==a[6]||a[3]==a[6]||a[4]==a[6]||a[5]==a[6]||a[6]==a[5]+1||a[6]==a[5]-1||a[6]==a[4]+2||a[6]==a[4]-2
||a[6]==a[3]+3||a[6]==a[3]-3 ||a[6]==a[2]+4||a[6]==a[2]-4||a[6]==a[1]+5||a[6]==a[1]-5)
continue;
for( a[7]=1;a[7]<=8;a[7]++)
{
if(a[1]==a[7]||a[2]==a[7]||a[3]==a[7]||a[4]==a[7]||a[5]==a[7]||a[6]==a[7]||a[7]==a[6]+1||a[7]==a[6]-1||a[7]==a[5]+2||a[7]==a[5]-2
||a[7]==a[4]+3||a[7]==a[4]-3 ||a[7]==a[3]+4||a[7]==a[3]-4||a[7]==a[2]+5||a[7]==a[2]-5||a[7]==a[1]+6||a[7]==a[1]-6)
continue;
for( a[8]=1;a[8]<=8;a[8]++)
if(a[1]==a[8]||a[2]==a[8]||a[3]==a[8]||a[4]==a[8]||a[5]==a[8]||a[6]==a[8]||a[7]==a[8]||a[8]==a[7]+1||a[8]==a[7]-1||a[8]==a[6]+2||a[8]==a[6]-2
||a[8]==a[5]+3||a[8]==a[5]-3 ||a[8]==a[4]+4||a[8]==a[4]-4||a[8]==a[3]+5||a[8]==a[3]-5||a[8]==a[2]+6||a[8]==a[2]-6||a[8]==a[1]+7||a[8]==a[1]-7)
continue;
else
{
printf("(0,%d);(1,%d);(2,%d);(3,%d);(4,%d);(5,%d);(6,%d);(7,%d)\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
count++;
}
}
}
}
}
}
}
}
printf("%d\n",count);
}
int main()
{
Queen();
return 0;
}