该问题是19世纪著名数学家高斯于1850年提出
- 在8X8的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后不能在同一行、同一列或者同一斜线上。问有多少种摆法。
#include "stdio.h"
int count = 1;
//判断是否有危险
int wx(int row, int n, char (*arr)[8])
{
int i = row;
int j = n;
int k = 0;
int flag1 = 0;
//上
for(k = i; k >= 0 ; k--)
{
if(arr[k][j])
{
flag1 = 1;
}
}
//左上
for(k = 0; i-k>=0 && j-k>=0; k++)
{
if(arr[i-k][j-k])
{
flag1 = 1;
}
}
//右上
for(k = 0; i-k>=0 && j+k<8; k++)
{
if(arr[i-k][j+k])
{
flag1 = 1;
}
}
if(flag1)
return 1;
else
return 0;
}
void eq(int row, int n, char (*arr)[8])
{
int i = 0;
int j = 0;
char arr2[8][8] = {0};
//递归出口,当行为8时打印棋盘
if(row == 8)
{
for(i = 0; i < 8; i++)
{
for(j = 0; j < 8; j++)
{
printf("%d ", *(*(arr+i)+j));
}
printf("\n");
}
printf("count: %d", count);
printf("\n");
count ++ ;
}
//遍历一行寻找安全位置,递归进入下一行
else
{
for(j = 0; j < n; j++)
{
if( !wx(row, j, arr) )
{
arr[row][j] = 1;
eq(row + 1, 8 , arr);
}
arr[row][j] = 0;
}
}
}
int main()
{
char arr[8][8] = {0};
eq(0, 8, arr);
return 0;
}
在Linux 环境下测试得: