八皇后问题(递归方法详解)

八皇后递归详解

核心代码如下:

//八皇后递归解法
#include<iostream>
using namespace std;

int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
int count = 0;//定义一个全局变量
bool available(int pointi,int pointj) //判断某个皇后是否与已有皇后冲突
{
    for(int i = 1; i<pointi; i++)
    {
        if(pointj == queen[i])
            return false;//同一列拒绝
        if((pointi-i) == (pointj-queen[i]))
            return false;//同一主对角线拒绝
        if((pointi-i) + (pointj-queen[i]) == 0)
            return false;//同一副对角线拒绝
    }
    return true;
}
void findSpace(int queenNumber) //在第queenNumber行找能放皇后的位置
{
//因为行数在递归中不断调用(即行数在递归一次取下一行),所以只要遍历列的位置
    for(int i = 1; i<9; i++) //从1~8遍历这一行的八个空位
    {
        if(available(queenNumber,i))
        {
//如果可以放这个位置就记录下第queenNumber个皇后的位置
            queen[queenNumber] = i;
            if(queenNumber == 8) //如果八个皇后都放满了统计一下
            {
                count++;//次数就增加一次
                return;
            }
            int nextNumber = queenNumber+1;//还有皇后没放递归放下一个皇后(取下一行)
            findSpace(nextNumber);//递归
        }
    }
    queen[--queenNumber] = -1;//如果这一行没有可放的位置说明上一行皇后放的位置不行,要为上一个皇后寻找新的可放位置(即就要重新再找一次)
    return;
}
int main()
{
    findSpace(1);//从(1,1)开始递归好理解
    cout << count << endl;
    return 0;
}

八皇后问题可以不只是限制于八个皇后,可以推广到n皇后问题,下期介绍。

//八皇后递归解法(C语言写法)

//#include<iostream>
//using namespace std;
#include<stdio.h>

int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
int count = 0;//定义一个全局变量
bool available(int pointi,int pointj) //判断某个皇后是否与已有皇后冲突
{
    for(int i = 1; i<pointi; i++)
    {
        if(pointj == queen[i])
            return false;//同一列拒绝
        if((pointi-i) == (pointj-queen[i]))
            return false;//同一主对角线拒绝
        if((pointi-i) + (pointj-queen[i]) == 0)
            return false;//同一副对角线拒绝
    }
    return true;
}
void findSpace(int queenNumber) //在第queenNumber行找能放皇后的位置
{
//因为行数在递归中不断调用(即行数在递归一次取下一行),所以只要遍历列的位置
    for(int i = 1; i<9; i++) //从1~8遍历这一行的八个空位
    {
        if(available(queenNumber,i))
        {
//如果可以放这个位置就记录下第queenNumber个皇后的位置
            queen[queenNumber] = i;
            if(queenNumber == 8) //如果八个皇后都放满了统计一下
            {
                count++;//次数就增加一次
                return;
            }
            int nextNumber = queenNumber+1;//还有皇后没放递归放下一个皇后(取下一行)
            findSpace(nextNumber);//递归
        }
    }
    queen[--queenNumber] = -1;//如果这一行没有可放的位置说明上一行皇后放的位置不行,要为上一个皇后寻找新的可放位置(即就要重新再找一次)
    return;
}
int main()
{
    findSpace(1);//从(1,1)开始递归好理解
    //cout << count << endl;
    printf("%d\n",count);
    return 0;
}

C写法

原文地址:https://www.cnblogs.com/DWVictor/p/10041623.html

时间: 2024-10-09 12:06:00

八皇后问题(递归方法详解)的相关文章

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 (斜率为1),问有多少种摆法.高斯认为有76种方案. 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 计算机发明后,有多种方法可以解决此问题. 算法思路:    首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法

ST MCU_GPIO的八种工作模式详解。

补充: N.P型的区别,就是一个为正电压启动(NMOS),一个为负电压启动(PMOS) GPIO的八种工作模式详解 浮空输入_IN_FLOATING带上拉输入_IPU带下拉输入_IPD模拟输入_AIN开漏输出_OUT_OD推挽输出_OUT_PP开漏复用输出_AF_OD推挽复用输出_AF_PP4输入 + 2 输出 + 2 复用输出,一共是8种模式,以下是八种模式的工作原理: GPIO浮空输入_IN_FLOATING模式工作原理以上截图就是浮空输入模式的原理图,图中阴影的部分在浮空输入模式下是处于不

八皇后问题-回溯法解

八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. int g_number = 0;? //多少种摆放方法?void EightQueen(){? ?const int queens = 8;? //棋盘大小?? ?int ColumnIndex[queens];? //列索引?//遍历行? ?for(int i = 0; i < queens; ++ i)?? ? ? ?ColumnIndex[i] = i;

[读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析

前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下的问题, 刚好自己之前也看过类似的问题, 于是便拿出来记录一下.本文内容: 参数传递问题剖析, string与stringbuilder详解 1,参数传递问题剖析 对于C#中的参数传递,根据参数的类型可以分为四类: 值类型参数的按值传递 引用类型参数的按值传递 值类型参数的按引用传递 引用类型参数的

NVIDIA Jetson TK1学习与开发(八):图文详解OpenGL在Jetson TK1上的安装和使用

图文详解OpenGL在Jetson TK1上的安装和使用 1.入门介绍与资源推介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库. OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khron

八、分组查询详解(group by &amp; having)

本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区别 分组后排序 where & group by & having & order by & limit 一起协作 mysql分组中的坑 in多列查询的使用 一.分组查询 语法: SELECT column, group_function,... FROM table [WHERE condition] GROUP BY group_by_expressio

python爬虫知识点总结(八)Selenium库详解

一.什么是Selenium? 答:自动化测试工具,支持多种浏览器.用来驱动浏览器,发出指令让浏览器做出各种动作,如下拉,跳转等. 爬虫中主要用来解决JavaScript渲染的问题. 注:如果用requests,urllib这些库无法正常获取网页内容,可以用Selenium来完成渲染 二.安装 pip3 install selenium 三.基本使用 原文地址:https://www.cnblogs.com/cthon/p/9410796.html

SpringCloud入门(八): Zuul 过滤器详解

Zuul 过滤器 zuul 有四种过滤器类型,分别是: 1.Pre:过滤器在请求被路由之前调用.我们可利用这种过滤器实现身份验证.在集群中选择请求的微服务.记录调试信息等: 2.Routing:过滤器将请求路由到微服务.这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服: 3.Post:过滤器在路由到微服务以后执行.这种过滤器可用来为响应添加标准的HTTP Header.收集统计信息和指标.将响应从微服务发送给客户端: 4.Err

一次暴力穷举解八皇后问题的血腥尝试(心疼我的CPU)

还没有接触到系统的算法课程,在JAVA教材看到了八皇后的题目.之前对于算法,我一直存在这一种偏见-----计算机的运算速度那么快有必要花费脑筋设计各种算法吗?(用暴力穷举不就好了?).然而当我解八皇后问题时,我的core-i5跑了半个小时接近跑完所有92个解,此处心疼本人cpu三秒.(为什么会这样,原因很简单:暴力穷举的话可能的情况数目是64*63*62*61*60*59*58*57=178462987637760种,即使电脑运算速度再快,也需要相当长的时间) 至此我初步体会到了算法的重要性--