关于对N皇后问题和回溯法的理解 个人非常推荐下面这个视频:算法与数据结构,回溯法求解八皇后,最经典的递归问题_哔哩哔哩_bilibili八皇后问题是计算机科学中最为经典的问题之一,该问题由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。八皇后问题,即在8×8的国际象棋盘上摆放八个皇后,使其不能互相攻击,任意两个皇后都不能处于同一行、同一列或同一斜线上,求出一共有多少种摆放方式,每种摆放方式的具体摆法。https://www.bilibili.com/video/BV1ZK411K7A8?share_source=copy_web
视频中的代码使用C++写的,个人接触嵌入式较多所以比较习惯用C
C语言代码如下:
/* N皇后问题 */
#include
#include
#define N 100 //宏定义最大的N
int attack[N][N];
char queen[N][N];
int cnt;
void init(int n);//初始化attack和queen数组
void print(int n);//打印符合要求的摆法
void print_ack(int n);//测试update_ack函数编写是否正确
void copy(int object[N][N],int target[N][N],int n);//将对象数组保存给目标数组
void update_ack(int x,int y,int n);//摆放queen后更新attack数组,将进queen攻路线上的值标为1
void backtrack(int row,int n);//回溯法 递归调用
int main(int argc, char const *argv[])
{
int n;
puts("Please input the N of queen:");
scanf("%d",&n);//计算nXn的皇后问题
init(n);//初始化attack和queen数组
backtrack(0,n);//从第0行开始摆放queen
printf("The number of required placement method =%d\n",cnt);
system("pause");
return 0;
}
void backtrack(int row,int n)
{
if(row==n)//递归执行到摆放完所有行的结束条件
{
cnt++;
print(n);
return ;
}
int col;
for(col=0;col=0 && nx=0 && ny
(N可以随意取,大于100的话需要修改宏定义 #define N 100 )
代码运行结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)