#include<stdio.h>
//定义一个全局变量
int count = 0 ;//记录多上种方法
/*
--------------------------------------
八皇后问题
--------------------------------------
*/
/*
------------------------------------
1. 判断两行两列上是否有皇后: 这个比较容易判断
2. 判断对角线线上是否有皇后: 对角线斜率为-1和1
i = -j+b1 ;
i = j+b2 ;
根据row与col就可以知道b1和b2
返回1表示危险
------------------------------------
*/
int is_danger(int (*a)[8] ,int row ,int col)
{
int i, j ;
int flag =0 ;
int b1 = row+col ;
int b2 = row-col ;
for(i=0 ;i<8 ;i++)
{
for(j=0 ;j<8 ;j++)
{
if( ( (i==(-j)+b1)|| (i==j+b2) ) &&a[i][j]==1 )
flag =1 ;
}
if(a[row][i]==1 || a[i][col]==1 )
flag= 1 ;
}
return flag ;
}
/*
-------------------------------------
打印出布局
-------------------------------------
*/
void print(int (*a)[8])
{
int i ,j;
for(i=0 ;i<8 ;i++)
{
for(j=0; j<8 ; j++)
{
printf("%d" ,a[i][j]) ;
}
printf("\n");
}
}
/*
---------------------------------
递归算法,求出布局
---------------------------------
*/
void queen(int (*a)[8] ,int row )
{
int i;
//当row=8时表示已经布局好了
if(row==8)
{
print(a);
count++ ;
printf("第%d种!\n",count);
}
else
{
for(i=0 ;i<8 ;i++)
{
//如果没有上锁
if(is_danger(a,row,i)==0)
{
a[row][i] =1 ;
queen(a,row+1);
a[row][i] =0 ;
}
}
}
}
int main()
{
//定义一个8行8列的棋盘
int a[8][8] ;
int i,j ;
//初始化a
for(i=0 ;i<8 ;i++)
{
for(j=0; j<8 ;j++)
{
a[i][j] = 0 ;
}
}
queen( a ,0) ;
return 0 ;
}
八皇后问题
最新推荐文章于 2023-07-07 14:04:01 发布