#include <stdio.h>
int method = 0 ;
int danger (int row , int j , int (*table)[8]) // 判定
{
int i , k , a=0 , b=0 , c=0 , d=0 , e=0 ;
// 列方向是否有危险(竖直方向)
for ( i = 0 ; i < 8 ; i++ )
{
if ( *(*(table+i)+j) != 0 )
{
a = 1 ;
break ;
}
}
// 判断左上方
for ( i = row , k = j ; i >= 0 && k >= 0 ; i-- , k-- ) // k作为j的临时变量
{
if ( *(*(table+i)+k) != 0 )
{
b = 1 ;
break ;
}
}
// 判断右上方
for ( i = row , k = j ; i >= 0 && k < 8 ; i-- , k++ )
{
if ( *(*(table+i)+k) != 0 )
{
c = 1 ;
break ;
}
}
// 判断右下方
for ( i = row , k = j ; i < 8 && k < 8 ; i++ , k++ )
{
if ( *(*(table+i)+k) != 0 )
{
d = 1 ;
break ;
}
}
// 判断左下方
for ( i = row , k = j ; i < 8 && k >= 0 ; i++ , k-- )
{
if ( *(*(table+i)+k) != 0 )
{
e = 1 ;
break ;
}
}
return (a+b+c+d+e) ;
}
void Eightqueen (int row , int n , int (*table)[8])
// 参数row表示起始行
// 参数n表示列数
// 参数(*table)[8]表示指向棋盘每一行的指针
{
int table2[8][8] , i , j ;
for ( i = 0 ; i < 8 ; i++ )
{
for ( j = 0 ; j < 8 ; j++ )
{
table2[i][j] = table[i][j] ; // 初始化临时棋盘
}
}
if (8 == row) // 棋盘放置完毕
{
printf("method %d\n",method+1);
for ( i = 0 ; i < 8 ; i++ )
{
for ( j = 0 ; j < 8 ; j++ )
{
printf("%d ",*(*(table2+i)+j)); // 打印临时棋盘
}
printf("\n");
}
printf("\n");
method ++ ;
}
else // 没放置完毕
{
for ( j = 0 ; j < n ; j++ ) // 一行上的每一格格子,通过列变化而游览
{
if ( !danger(row,j,table2) ) // 针对第row行第j列的位置进行判定
{
// 安全的情况
for( i = 0 ; i < 8 ; i++ ) // 这里i做列
{
*(*(table2+row)+i) = 0 ; // 初始化为0
}
*(*(table2+row)+j) = 1 ; // 放置皇后
Eightqueen(row+1,n,table2); // 递归
}
}
}
}
int main ()
{
int table[8][8] , i , j ;
for ( i = 0 ; i < 8 ; i++ )
{
for ( j = 0 ; j < 8 ; j++ )
{
table[i][j] = 0 ; // 初始化棋盘
}
}
Eightqueen(0,8,table); // 放置八皇后
printf("total method: %d\n\n",method); // 方法总数
return 0 ;
}