#include <stdio.h>
// 记录共有多少种方法
int count = 0;
/* 判断是否有危险 */
int noDanger(int row, int j, int (*chess)[8])
{
int flag0 = 0, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0;
/* 判断列是否危险 */
for(int i = 0; i < 8; i ++)
{
if(*(*(chess+i)+j) != 0)
{
flag0 = 1;
break;
}
}
/* 判断左上方 */
for(int i = row, k = j; i >= 0&& k >= 0; i --, k--)
{
if(*(*(chess+i)+k) != 0)
{
flag1 = 1;
break;
}
}
/* 判断右下方 */
for(int i = row, k = j; i < 8 && k < 8; i ++, k++)
{
if(*(*(chess+i)+k) != 0)
{
flag2 = 1;
break;
}
}
/* 判断右上方 */
for(int i = row, k = j; i >= 0 && k < 8; i --, k++)
{
if(*(*(chess+i)+k) != 0)
{
flag3 = 1;
break;
}
}
/* 判断左下方 */
for(int i = row, k = j; i < 8 && k >= 0; i ++, k--)
{
if(*(*(chess+i)+k) != 0)
{
flag4 = 1;
break;
}
}
if(flag0 || flag1 || flag2 ||flag3 || flag4)
return 0;
else
return 1;
}
// 参数(*chess)8:表示指向棋盘每一行指针
void EightQueen(int row, int (*chess)[8])
{
int chess2[8][8];
for(int i = 0; i < 8; i ++)
for(int j = 0; j < 8; j ++)
chess2[i][j] = chess[i][j];
/* 递归边界 */
if(row == 8)
{
printf("第 %d 种\n", count+1);
for(int i = 0; i < 8; i ++)
{
for(int j = 0; j < 8; j ++)
printf("%d ", *(*(chess2+i)+j));
printf("\n");
}
printf("\n");
count ++;
}
else
{
// 分别判断现在这行每一个位置
for(int j = 0; j < 8; j ++)
{
//判断是否危险
if(noDanger(row, j, chess))
{
// 整行初始化为0
for(int i = 0; i < 8; i++)
{
*(*(chess2+row)+i) = 0;
}
*(*(chess2+row)+j) = 1;
EightQueen(row+1, chess2);
}
}
}
}
int main()
{
int chess[8][8];
for(int i = 0; i < 8; i ++)
for(int j = 0; j < 8; j ++)
{
chess[i][j] = 0;
}
// 从第 1 行开始放置皇后
EightQueen(0, chess);
printf("总共 %d 种方法\n", count);
return 0;
}
递归之八皇后
最新推荐文章于 2023-01-12 15:38:02 发布