本算法是经过学习B站UP主讲解后,整理出来的代码,编译无误,可生成92种方式。
#include "stdafx.h"
#include"stdlib.h"int place[8] = {0};
//用来记录当前行的皇后在第几列
bool flag[8] = {1,1,1,1,1,1,1,1};
//那一列有皇后占领
bool d1[15] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
//上对角线是否占领
bool d2[15] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
//下对角线是否占领
int number = 0;
//技术总共有多少解法void print(int n)
{
int i,j;
int table[8][8]={0};
for(i=0;
i<8;
i++)
table[i][place[i]]=1;
printf_s("\n第 %d 种\n",n);
for(i=0;
i<8;
i++)
for(j=0;
j<8;
j++)
{
printf_s("%d ",table[i][j]);
if(j==7)printf_s("\n");
}
}void generate(int n)
{
int col;
//当前列
for(col=0;
col<8;
col++)//八列都需要判断完
{
if(flag[col]==1 && d1[n-col+7] == 1 && d2[n+col] == 1)//查看占领状态
{
//符合条件即占领
place[n]=col;
flag[col] = 0;
d1[n - col + 7] = 0;
d2[n + col] = 0;
if(n<7)//八个皇后全部放置完毕判断
generate(n+1);
else
{
++number;
print(number);
}
//所有的检查完,再继续回溯,确保得出所有解
flag[col] = 1;
d1[n - col + 7] = 1;
d2[n + col] = 1;
}
}
}int main()
{
printf_s("八皇后放法:\n");
generate(0);
printf_s("总共有 %d 种八皇后放法\n", number);
system("pause");
return 0;
}
【八皇后问题C语言解法(递归、回溯)】
推荐阅读
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 【C】题目|【C语言】题集 of ⑥
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- c语言|C语言初期学习遇到的特殊点 【三子棋详解】【初学者福音,详细总结,复习能手】
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- 个人理解|【C语言基础之类型转换】
- c语言|【C语言】自定义类型 结构体 枚举 联合
- 学习分享|【C语言函数基础】