代码
#include "iostream"
using namespace std;
int number = 0;
int isleague(int row, int j, int(*chess)[8])
{
int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
// 判断竖的方向是否合法(是否有冲突)
for (i = 0; i < 8; i++)
{
if (*(*(chess + i) + j) != 0)
{
flag1 = 1;
break;
}
}
// 判断左上方是否合法
for (i = row, k = j; i >= 0 && k >= 0; i--, k--)
{
if (*(*(chess + i) + k) != 0)
{
flag2 = 1;
break;
}
}
// 判断右下方是否合法
for (i = row, k = j; i < 8 && k < 8; i++, k++)
{
if (*(*(chess + i) + k) != 0)
{
flag3 = 1;
break;
}
}
// 判断右上方是否合法
for (i = row, k = j; i >= 0 && k < 8; i--, k++)
{
if (*(*(chess + i) + k) != 0)
{
flag4 = 1;
break;
}
}
// 判断左下方是否合法
for (i = row, k = j; i < 8 && k >= 0; i++, k--)
{
if (*(*(chess + i) + k) != 0)
{
flag5 = 1;
break;
}
}
if (flag1 || flag2 || flag3 || flag4 || flag5)
{
return 0;
}
else
{
return 1;
}
}
/* 参数row: 行 参数cols: 列 参数int (*(chess)[8]): 指向棋盘行的指针 */
void Eight_Queens(int row, int cols, int (*chess)[8])
{
int chess2[8][8]; // 临时棋盘
int i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
chess2[i][j] = chess[i][j]; // 棋盘的赋值
}
}
if (8 == row)
{
printf("第 %d 种方法:\n", number + 1);
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
printf("%d ", *(*(chess2 + i) + j));
}
printf("\n");
}
printf("\n");
number++;
}
else
{
// 判断这个位置是否合法
// 如果合法,继续往下
for (j = 0; j < cols; j++)
{
if (isleague(row, j, chess))
{
for (i = 0; i < 8; i++)
{
*(*(chess2 + row) + i) = 0;
}
*(*(chess2 + row) + j) = 1;
Eight_Queens(row + 1, cols, chess2); // 递归
}
}
}
}
void main()
{
int chess[8][8];
int i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
chess[i][j] = 0;
}
}
Eight_Queens(0, 8, chess);
system("pause");
}
说明
1的位置是皇后应该在的位置,共有92种方法,因为控制台缓存的问题,不能打印全部,大家可以通过 debug 的方法逐一查看。