程序设计与算法(二)算法基础》《第二周 递归》N皇后问题

https://www.cnblogs.com/franknihao/p/9416145.html

问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。

在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式。

/*
Recurse
N Queens problem
*/
#include<iostream>
#include<cmath>
using namespace std;

void NQueen(int k);
int N;
//用来存放算好的皇后位置。最左上角是(0,0)
int queenPos[100];

int main()
{
    cin >> N;
    NQueen(0); //从第 0 行开始摆皇后

    return 0;
}
// 在 0~k 1 行皇后已经摆好的情况下,摆第 k 行及其后的皇后
void NQueen(int k)
{

    int i;
    if (k == N) // N 个皇后已经摆好
    {
        for (i = 0; i < N; i++)
        {
            cout << queenPos[i] + 1<<" ";
        }
        cout << endl;
        return;

    }
    // 逐尝试第 k 个皇后的位置
    // 0~N 列遍历 ,第K行皇后应该放在第几列
    for (i = 0; i < N; i++)
    {
        int j;
        for (j = 0; j < k; j++)
        {

            // 和已经摆好的 k 个皇后的位置比较,看是否冲突
            // 1. 不能在同一列
            // 2. 不能在对角线上,即 行间距  != 列间距
            if (queenPos[j] == i || abs(k - j) == abs(i - queenPos[j]))
            {
                break; //冲突,则试下一个位置
            }
        }
        if (j == k) // 当前选的位置 i 不冲突
        {
            queenPos[k] = i; //将第 k 个皇后摆放在位置 i
            NQueen(k + 1);
        }
    }
}

原文地址:https://www.cnblogs.com/focus-z/p/11409968.html

时间: 2024-08-30 03:25:39

程序设计与算法(二)算法基础》《第二周 递归》N皇后问题的相关文章

20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结

20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目(加.减.乘.除) 需要实现计算结果的输出 将正确的计算结果与用户输入的计算结果进行比较得出最终的正确率 之前编写的程序还有很多问题,这周主要对这些问题进行改进和升级,我们成功实现了这些功能. 设计思路 1. 首先我们需要编写随机生成数字和随机生成符号的代码,把他们编写好后保存 2. 我们需要利用之前编写好的随

处理分类问题常用算法(二)-----算法岗面试题

● 分层抽样的适用范围 参考回答: 分层抽样利用事先掌握的信息,充分考虑了保持样本结构和总体结构的一致性,当总体由差异明显的几部分组成的时候,适合用分层抽样. ● LR的损失函数 参考回答: M为样本个数,为模型对样本i的预测结果,为样本i的真实标签. ● LR和线性回归的区别 参考回答: 线性回归用来做预测,LR用来做分类.线性回归是来拟合函数,LR是来预测函数.线性回归用最小二乘法来计算参数,LR用最大似然估计来计算参数.线性回归更容易受到异常值的影响,而LR对异常值有较好的稳定性. ● 生

EM算法(二)-算法初探

一.EM算法简介 在EM算法之一--问题引出中我们介绍了硬币的问题,给出了模型的目标函数,提到了这种含隐变量的极大似然估计要用EM算法解决,继而罗列了EM算法的简单过程,当然最后看到EM算法时内心是懵圈的,我们也简要的分析了一下,那回过头来,重新看下EM算法的简单介绍: 输入:观测变量数据Y,隐变量数据Z,联合分布$P(Y,Z|\theta)$,条件分布$P(Z|Y,\theta)$ 输出:模型参数$\theta$ (1)选择参数初值$\theta^{(0)}$,进行迭代: (2)E步:记$\t

新手自学:pytion基础(第二周笔记)

一,模块初识 库 .标准库,不需要安装使用pytion最基础的内容  .第三方库 必须下载安装 .自己写模块或者文件名字不能和需要导入的库名相同import sys  #sys 模块 sys.path   print(sys.path) #打印环境变量 提示sys.xxxprint(sys.argv) #打印绝对路径 :相对路径print(sys.argv[2])import os #用于和操作系统进行交互模块的os模块os.system("dir") #dir查看当前路径cmd_re

计算机基础第二周作业 作业整理函数知识点:(大部分笔记都在电脑的印象笔记里面) 这次总结的粗了一点

一. 字符编码 核心:以什么编码写的存入硬盘,就以什么编码取出 1.1  内存使用的是unicode编码,全是两个字节提高传输速度..一般都是使用utf-8的万国编码,优点是节省空间.缺点是运行速度相对较慢 1.2  数据最先产生在内存中的 是unicode格式,想要传输就要转化成二进制的bytes格式 1 #unicode----->encode(utf-8)------>bytes 2 拿到bytes,就可以往文件内存放或者基于网络传输 3 #bytes------>decode(g

【网易】 【作业】 程序设计入门—C语言 翁恺 第二周

#include<stdio.h> int main() { int a=0,b=0; scanf("%d",&a); if(a>=800) { b=a-800; printf("%d",b); } else{ printf("%d",b=2400+a-800); } system("pause"); } #include<stdio.h> int main() { int a=0,x=0

算法与数据结构基础11:C++实现——二拆搜索树节点删除

基于我的另一篇文章<算法与数据结构基础4:C++二叉树实现及遍历方法大全> ,二叉树的结构用的这篇文章里的. 二查找叉树的删除可以细分为三种情况: 1 被删除的是叶子节点,直接删除: 2 被删除只有一个子节点,指针下移: 3 有两个子节点,为了不破坏树的结构,需要找出一个节点来替换当前节点. 根据二叉树的特点,当前节点大于所有左子树,小于所有右子树, 可以用左子树中最大的节点,或者右子树最小的节点来替换当前节点,然后删除替换节点. // BSTree.h #include <cstdio

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

王之泰201771010131《面向对象程序设计(java)》第二周学习总结

王之泰201771010131<面向对象程序设计(java)>第二周学习总结 第一部分:理论知识学习部分 第三章 第三章内容主要为Java语言的基础语法,主要内容如下 1.基础知识 1.1标识符 a)标识符可用作类名.变量名.方法名.数组名.文件名等. 注:第一个符号不能为数字,即不能用数字开头. 1.2关键字 a)关键字是Java语言中已经被赋予特定意义的一些单词. b)常见有:class.public.try.catch.if. float.import.void等. 注:关键字不做变量名