00 问题

在NN(这个N==N皇后的N)的方格棋盘上放置n个皇后,要求:1.每个皇后在不同行不同列;2.每个皇后在不同左右对角线

输出要求:输出符合条件的所有解,解以皇后的坐标的形式。

01 思路

拿到这个问题如果用蛮力,那么OK,把皇后序号与行的序号关联在一起,去探查列,每多放一个皇后,就是一遍遍地回头遍历检查二维数组的事情;

但是如果想一下,用归纳法,我们考虑一下每一次放皇后的过程,我们需要考虑哪些因素,以及执行哪些步骤?

如果是放第一个皇后,那么ok,无条件返回true,因为没有限制条件,第一行任何一列都符合条件。

else 如果是中间的皇后,比如第i个皇后,那么从第i行头考虑,逐列探查,每一列得考虑前i-1的皇后,每一个都得拎出来检查一下条件,来确保第i个皇后所放的列是对的

这样就会发现,每一次放皇后取决于前面的皇后,而第一个随便放,皇后个数不超过n,这样就可以设计递归出口和递归主体了。出口是到n,主体就是前面的if-else。

主体的if-else可以再分几步:

  • 逐列,是一次循环

  • 探查,可以写一个函数

  • 探查函数中,探查需从第0个皇后查起,是一个循环

  • 探查函数返回许可,主控函数queen递归下一个皇后

  • 递归终点即n行走完,所有皇后落位。

02 代码


 1 #include<stdio.h>
2 #include<stdlib.h>
3 #define N 20
4 ​
5 int q[N];//存皇后的列数(从0开始
6 int count = 0;
7 void dispasolution(int n){
8 printf("The %dth个解:", ++count);
9 for(int i=0;i<=n;i++){
10 printf("(%d,%d)", i,q[i]);
11 }
12 printf("\n");
13 }
14 bool place(int i, int j){
15 if(i==1)return true;//第一个必定正确
16 int k=1;
17 while(k<i){
18 if(q[k]==j||abs(q[k]-j)==abs(i-k)){
19 return false;
20 }
21 k++;
22 }
23 return true;
24 }
25 void queen(int i, int n){
26 if(i>n)dispasolution(n);//递归出口,输出
27 else{
28 for(int j=1;j<=n;j++){
29 if(place(i,j)){//如果符合条件就把第i个皇后放下去,进一步递归
30 q[i]=j;
31 queen(i+1,n);
32 }
33 }
34 }
35 }
36 ​
37 int main(){
38 int n;
39 printf("皇后问题(n<20)n=");
40 scanf("%d",&n);
41 if(n>20){
42 printf("n is too big!\n");
43 }
44 else{
45 printf("%d皇后问题的求解如下:\n",n);
46 queen(1,n);//调用递归主控函数
47 }
48 return 0;
49 }

03 测试

示例 n=6

1 皇后问题(n<20)n=6
2 6皇后问题的求解如下:
3 The 1th个解:(0,0)(1,2)(2,4)(3,6)(4,1)(5,3)(6,5)
4 The 2th个解:(0,0)(1,3)(2,6)(3,2)(4,5)(5,1)(6,4)
5 The 3th个解:(0,0)(1,4)(2,1)(3,5)(4,2)(5,6)(6,3)
6 The 4th个解:(0,0)(1,5)(2,3)(3,1)(4,6)(5,4)(6,2)
 

算法学习->递归典例N皇后问题的更多相关文章

  1. DFS 深搜专题 入门典例 -- 凌宸1642

    DFS 深搜专题 入门典例 -- 凌宸1642 深度优先搜索 是一种 枚举所有完整路径以遍历所有情况的搜索方法 ,使用 递归 可以很好的实现 深度优先搜索. 1 最大价值 题目描述 ​ 有 n 件物品 ...

  2. Python之路,Day21 - 常用算法学习

    Python之路,Day21 - 常用算法学习   本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...

  3. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  4. 算法学习之C语言基础

    算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...

  5. 数据结构学习之栈求解n皇后问题

    数据结构学习之栈求解n皇后问题 0x1 目的 ​ 深入掌握栈应用的算法和设计 0x2 内容 ​ 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...

  6. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  7. 算法学习之快速排序的C语言实现

    近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...

  8. 数据挖掘算法学习(八)Adaboost算法

    本文不定期更新.原创文章,转载请附上链接http://blog.csdn.net/iemyxie/article/details/40423907 谢谢 Adaboost是一种迭代算法,其核心思想是针 ...

  9. Java实现 蓝桥杯VIP 算法提高 递归倒置字符数组

    算法提高 递归倒置字符数组 时间限制:1.0s 内存限制:512.0MB 问题描述 完成一个递归程序,倒置字符数组.并打印实现过程 递归逻辑为: 当字符长度等于1时,直接返回 否则,调换首尾两个字符, ...

随机推荐

  1. 题解 最长道路tree

    题目传送门 题目大意 给出一个\(n\)个点的树,每个点有点权,定义一条链的贡献为该链的点数乘上链上的权值和,求出树上所有链中的权值最大值. \(n\le 5\times 10^4\) 思路 算是我入 ...

  2. Pytorch 的安装

    GPU版本的安装 Windows平台 CPU 版本安装 conda install pytorch torchvision cpuonly -c puython Windows平台需安装VC,需要的联 ...

  3. Java 创建PDF打印小册子

    概述 PDF打印小册子是指将PDF格式文档在打印成刊物前需要提前进行的页面排版,以便在打印后装订成册.下面以Java代码展示如何来实现.这里调用Free Spire.PDF for Java中的Pdf ...

  4. Java(1)开发环境配置及第一个程序Hello World

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201468.html 博客主页:https://www.cnblogs.com/testero ...

  5. C++手动加载CLR运行托管程序(CLR Hosting)

    转载自:http://www.linuxidc.com/Linux/2012-10/72293.htm 机制介绍 有些时候主程序是通过C/C++实现的,但是我们希望通过托管代码来扩展非托管程序,从而也 ...

  6. Java 读取PDF中的表格

    一.概述 本文以Java示例展示读取PDF中的表格的方法.这里导入Spire.PDF for Javah中的jar包,并使用其提供的相关及方法来实现获取表格中的文本内容.下表中整理了本次代码使用到的主 ...

  7. [敏捷软工团队博客]Beta阶段发布声明

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段发布声明 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...

  8. 第6次 Beta Scrum Meeting

    本次会议为Beta阶段第6次Scrum Meeting会议 会议概要 会议时间:2021年6月8日 会议地点:「腾讯会议」线上进行 会议时长:15min 会议内容简介:对完成工作进行阶段性汇报:对下一 ...

  9. Spring Cloud Alibaba整合Sentinel

    Spring Cloud Alibaba 整合 Sentinel 一.需求 二.实现步骤 1.下载 sentinel dashboard 2.服务提供者和消费者引入sentinel依赖 3.配置控制台 ...

  10. (五)、Docker 容器数据卷

    1.什么是数据卷 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker comm ...