首页 > 编程语言 >算法笔记-N皇后求解

算法笔记-N皇后求解

时间:2025-01-23 15:54:54浏览次数:1  
标签:求解 int MAX 笔记 char 算法 皇后 col SIZE

n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行、纵行或斜线上。请问有多少种摆法,并将每种摆法打印出来。

递归算法1(最暴力的解法)

可以从左到右尝试棋子的摆放,例如先放置在第一行(1,1)放置,然后在第二行开始找与第一行放置不冲突的棋子,找到了(2,3),接着开始在第三行找,找到了(3,2)……一直到最后一行。如果出现下一行的每一列都有冲突,则返回到上一行,修改上一行的放置……重复上面的操作。

  1. 关于存储放置的棋子的坐标,一般会想到二维数组来存放,如arr[i][j]=1,代表i行,j列有棋子,实际上用一个一维数组就可以解决该问题。例如a[4]=1表示第4列有棋子,而且无需再判断两个皇后是否在同一行。
  2. 关于如何判断两个棋子在不在对角线,若两个棋子坐标(X 1,Y1),(X 2,Y2),则 |X 1-X2| != |Y 1-Y2|。当然在在之前应该首先判断在不在同一列(a[j]==y)

    /* 回溯算法:n 皇后 */
    void backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],
    bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {
    // 当放置完所有行时,记录解
    if (row == n) {
    res[*resSize] = (char **)malloc(sizeof(char *) * n);
    for (int i = 0; i < n; ++i) {
    res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));
    strcpy(res[*resSize][i], state[i]);
    }
    (*resSize)++;
    return;
    }
    // 遍历所有列
    for (int col = 0; col < n; col++) {
    // 计算该格子对应的主对角线和次对角线
    int diag1 = row - col + n - 1;
    int diag2 = row + col;
    // 剪枝:不允许该格子所在列、主对角线、次对角线上存在皇后
    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    // 尝试:将皇后放置在该格子
    state[row][col] = 'Q';
    cols[col] = diags1[diag1] = diags2[diag2] = true;
    // 放置下一行
    backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);
    // 回退:将该格子恢复为空位
    state[row][col] = '#';
    cols[col] = diags1[diag1] = diags2[diag2] = false;
    }
    }
    }

    /* 求解 n 皇后 */
    char ***nQueens(int n, int *returnSize) {
    char state[MAX_SIZE][MAX_SIZE];
    // 初始化 n*n 大小的棋盘,其中 'Q' 代表皇后,'#' 代表空位
    for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
    state[i][j] = '#';
    }
    state[i][n] = '\0';
    }
    bool cols[MAX_SIZE] = {false}; // 记录列是否有皇后
    bool diags1[2 * MAX_SIZE - 1] = {false}; // 记录主对角线上是否有皇后
    bool diags2[2 * MAX_SIZE - 1] = {false}; // 记录次对角线上是否有皇后

    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);
    *returnSize = 0;
    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);
    return res;
    }

      

标签:求解,int,MAX,笔记,char,算法,皇后,col,SIZE
From: https://www.cnblogs.com/nmsx/p/18687896

相关文章

  • 算法笔记-装石头(利用二进制位数)
    一、装石头(利用二进制位数)题目描述:把1000个石头装在10个袋子里面,任取其中的一袋,或把几个袋中的石头数加起来。都可以凑成1~1000中任何一种石头数量,求这10个袋子分别装了多少个石头?解法:考虑1000的二进制刚好十个位,所以按照二进制转十进制的原理,1~1000中任何一个数用10位的二进制......
  • 辛普森积分学习笔记
    辛普森积分学习笔记定积分定积分的定义设函数\(f(x)\)在区间\([a,b]\)上有界,在\([a,b]\)中插入若干个分点\[a=x_0<x_1<x_2<\cdots<x_{n-1}<x_n=b\]把区间\([a,b]\)分成\(n\)个小区间,各小区间的长度依次为\(\Deltax_i=x_i-x_{i-1}(1\lei\len)\)。在各小区间上任......
  • Golang笔记——静态强类型、编译型、并发型语言
    大家好,这里是GoodNote,关注公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Go语言的基础知识,包括数据类型,深浅拷贝,编程范式,Go语言是一种静态(静态类型语言和静态语言)强类型、编译型、并发型,并具有垃圾回收功能的编程语言。文章目录1.Go语言基础知识数据类型......
  • 折腾笔记[11]-使用rust进行直接法视觉里程计估计
    摘要使用rust实现了一个完整的直接法视觉里程计系统,能够通过比较两幅图像中的像素强度来估计相机的运动。它通过单层和多层的优化策略,结合图像金字塔和并行计算,提高了位姿估计的精度和效率。最终,代码输出了优化后的相机位姿变换矩阵,并可视化了投影点的位置。Thisisacomplete......
  • 密钥派生算法KDF
    NOTE   密钥派生算法的关键点如下伪随机函数迭代次数初始密钥材料,如密码、盐等块关系,类似对称加密模式的ECB或者CBC等定义    密钥派生算法是从一个密钥产生一个或多个密钥的过程,产生的密钥可用于不同的安全需求,比如加解密、身份验证和完整性保护等。派生过程......
  • Python算法模糊匹配:FuzzyWuzzy深度剖析,从入门到精通,解决你所有需要匹配的需求
    在数据科学和文本处理的世界中,字符串匹配是一个非常普遍的问题。FuzzyWuzzy作为一个强大的Python库,通过模糊匹配技术解决了许多由于拼写错误、格式不一致引起的问题。本文将详细介绍FuzzyWuzzy,从基本概念到高级应用,帮助你掌握这一工具。目录FuzzyWuzzy简介安装与快速开始基础......
  • 浅谈根号算法
    前言本人在HL集训时爱上了根号算法,遂开此坑。所有根号算法都有一个共性:与暴力算法息息相关。但它们并不是拙劣的暴力,而是优美的暴力。所以根号算法也被称之为“暴力美学”。根号分治就是一个典型的根号算法。当题目性质与\(x\)和\(\frac{n}{x}\)都有关时,我们可以找到一个......
  • 联想 ThinkPad 笔记本T14 CPU 降频解决方案
    原因:在工作中,打开多个IDE的情况下,会出现卡顿问题,发现是由于CPU降频到0.5GHz导致的。环境:笔记本是联想ThinkPadT14CPU:12thGenInterlCorei7-1260P系统为Window10专业版解决办法经过搜索后,适合的方案如下:打开电源的卓越性能模式在WindowsPowershell中......
  • 读书笔记:高性能架构之道
    高性能架构之道,分布式、并发编程、数据库调优、缓存设计、IO模型、前端优化、高可用第1章高性能架构0011.1软件架构001理念层面:如研究软件的开发模型、评价指标、架构风格等。架构层面:研究如何协调和组织软件系统、子系统、模块之间的关系。类比于规划和设计建筑物的承......
  • 基于协同过滤算法的微信小程序文章推荐系统的设计与实现【高分毕设】
    目录资源链接论文链接后端系统链接微信端系统链接答辩PPT1.绪论1.1课题背景1.2研究目的和意义1.3文献回顾2.关键技术介绍2.1前端技术2.2协同过滤3.需求分析3.1可行性分析3.2功能需求分析3.2.1用户管理3.2.2文集管理3.2.3图书管理3.2.4文集和图书分类3.2.5......