N皇后问题-回溯法-C语言

N皇后问题-回溯法-C语言,第1张

关于对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 )

代码运行结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/733331.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)