八皇后是一个有名的问题,对于初学者来说是一个比较好的练手的习题,有助于对函数的递归调用的理解和运用。共有92种是符合要求的。
八皇后问题要求在一个8 × 8 的 棋盘上放上8个皇后,使得每一个皇后既攻击不到另外 7 个皇后,也不被另外 7 个皇后所攻击。 按照国际象棋的规则, 一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子
/*八皇后源代码如下所示,解决这个问题有递归法和迭代法,我所使用的是函数的递归调用,没有写注释,都是原创,我自己写的,我是一个初学者,写得很差,望谅解*/
#include
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();
}
/*以下为运行的结果:
--------------------------
第1种
* 0 0 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 0 0 * 0 0 0
0 0 0 0 0 0 0 *
0 * 0 0 0 0 0 0
0 0 0 * 0 0 0 0
0 0 0 0 0 * 0 0
0 0 * 0 0 0 0 0
--------------------------
第2种
* 0 0 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 0 * 0 0 0 0
0 0 0 0 0 * 0 0
0 0 0 0 0 0 0 *
0 * 0 0 0 0 0 0
0 0 0 0 * 0 0 0
0 0 * 0 0 0 0 0
--------------------------
第3种
* 0 0 0 0 0 0 0
0 0 0 0 0 * 0 0
0 0 0 0 0 0 0 *
0 0 * 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 0 * 0 0 0 0
0 * 0 0 0 0 0 0
0 0 0 0 * 0 0 0
--------------------------
第4种
* 0 0 0 0 0 0 0
0 0 0 0 * 0 0 0
0 0 0 0 0 0 0 *
0 0 0 0 0 * 0 0
0 0 * 0 0 0 0 0
0 0 0 0 0 0 * 0
0 * 0 0 0 0 0 0
0 0 0 * 0 0 0 0
--------------------------
第5种
0 0 0 0 0 * 0 0
* 0 0 0 0 0 0 0
0 0 0 0 * 0 0 0
0 * 0 0 0 0 0 0
0 0 0 0 0 0 0 *
0 0 * 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 0 * 0 0 0 0
--------------------------
第6种
0 0 0 * 0 0 0 0
* 0 0 0 0 0 0 0
0 0 0 0 * 0 0 0
0 0 0 0 0 0 0 *
0 * 0 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 * 0 0 0 0 0
0 0 0 0 0 * 0 0
--------------------------
第7种
0 0 0 0 * 0 0 0
* 0 0 0 0 0 0 0
0 0 0 0 0 0 0 *
0 0 0 * 0 0 0 0
0 * 0 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 * 0 0 0 0 0
0 0 0 0 0 * 0 0
--------------------------
第8种
0 0 * 0 0 0 0 0
* 0 0 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 0 0 * 0 0 0
0 0 0 0 0 0 0 *
0 * 0 0 0 0 0 0
0 0 0 * 0 0 0 0
0 0 0 0 0 * 0 0
--------------------------
第9种
0 0 0 0 * 0 0 0
* 0 0 0 0 0 0 0
0 0 0 * 0 0 0 0
0 0 0 0 0 * 0 0
0 0 0 0 0 0 0 *
0
* 0 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 * 0 0 0 0 0
--------------------------
第10种
0 0 0 0 0 0 * 0
* 0 0 0 0 0 0 0
0 0 * 0 0 0 0 0
0