问题描述:
如何能够在8*8的国际象棋盘上放置八个皇后,使其任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。共有92组解。
#include<stdio.h>
int qp[8][8];
void printqp()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%d",qp[i][j]);
printf("\n");
}
printf("\n\n");
getch();
}
void fh(int x, int y) /*标记所禁止的位置*/
{
int i,j;
for(j=0;j<8;j++)
{
if(j!=y) qp[x][j]=1;
}
for(i=0;i<8;i++)
{
if(i!=x) qp[i][y]=1;
}
for(i=1;x-i>=0&&y-i>=0;i++)
{
qp[x-i][y-i]=1;
}
for(i=1;x+i<8&&y+i<8;i++)
{
qp[x+i][y+i]=1;
}
for(i=1;x-i>=0&&y+i<8;i++)
{
qp[x-i][y+i]=1;
}
for(i=1;x-i<8&&y-i>=0;i++)
{
qp[x+i][y-i]=1;
}
}
int main()
{
int row1,row2,row3,row4,row5,row6,row7,row8,i,j,count;
count=0;
for(row1=0;row1<8;row1++)
for(row2=0;row2<8;row2++)
for(row3=0;row3<8;row3++)
for(row4=0;row4<8;row4++)
for(row5=0;row5<8;row5++)
for(row6=0;row6<8;row6++)
for(row7=0;row7<8;row7++)
for(row8=0;row8<8;row8++)
{
for(i=0;i<8;i++)
for(j=0;j<8;j++)
qp[i][j]=0;
qp[0][row1]=2;
fh(0,row1);
if(qp[1][row2]==0)
{
qp[1][row2]=2;
fh(1,row2);
if(qp[2][row3]==0)
{
qp[2][row3]=2;
fh(2,row3);
if(qp[3][row4]==0)
{
qp[3][row4]=2;
fh(3,row4);
if(qp[4][row5]==0)
{
qp[4][row5]=2;
fh(4,row5);
if(qp[5][row6]==0)
{
qp[5][row6]=2;
fh(5,row6);
if(qp[6][row7]==0)
{
qp[6][row7]=2;
fh(6,row7);
if(qp[7][row8]==0)
{
qp[7][row8]=2;
count=count+1;
printf("%d\n",count);
printqp();
}
}
}
}
}
}
}
}
}