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. Mysql 5.7版本,所有的坑,这里都有

    MYSQL5.7版本流程的坑,我这里都有 必须按照如下操作.不按照下面操作,出错误不要怪我哦_ 我们首先在官网下载mysql5.7版本 解压之后,在bin相同目录下创建一个my.ini配置文件里面内容 ...

  2. Serverless 解惑——函数计算如何安装字体

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  3. MySQL8 根据某属性查询字段排名由自定义变量到rank()的变动

    在mysql8 之前的版本,因为没有rank()方法的存在,所以在对字段进行排名时,使用的是自定义自变量的方法,比如: select id,name,@rank=@rank+1 as ranks fr ...

  4. 洛谷5038 [SCOI2012]奇怪的游戏(二分+网络流+判断奇偶)

    寒假的时候就听过这个题.但是一直没有写. qwq 首先,我们发现题目中的图是个网格图,然后每次可以将相邻两个格子加一. 很容易就想到是黑白染色.那么每次操作,就相当于同时操作一个白点,一个黑点. 我们 ...

  5. 简单几步零成本使用Vercel部署OneIndex 无需服务器搭建基于OneDrive的网盘

    前提 你需要一个OneDrive账号,必须管理员开放API 需要已安装Node.js 拥有Github账号,没有就注册一个 魔法上网环境(看情况) 注册应用 登录https://portal.azur ...

  6. SpringCloud-SpringBoot-SpringCloudAlibaba对应版本选择

    一.SpringCloud-SpringBoot 对应的版本选择 SpringCloud官网常规方式只能查看最新的几个版本信息 https://spring.io/projects/spring-cl ...

  7. iNeuOS工业互联网操作系统,智慧用电测控应用案例

    目       录 1.      概述... 2 2.      系统部署结构... 2 3.      用电测控终端... 3 4.      系统应用介绍... 6 1.   概述 通过物联网技 ...

  8. Sequence Model-week1编程题1(一步步实现RNN与LSTM)

    一步步搭建循环神经网络 将在numpy中实现一个循环神经网络 Recurrent Neural Networks (RNN) are very effective for Natural Langua ...

  9. Java多线程中的死锁

    Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...

  10. GitHub Universe 2021|MS Reactor 邀你共聚年度盛会

    GitHub Universe 2021 将于2021年10月27-28日(PDT)在线直播,MS Reactor 将与 CSDN 合作进行转播,与你一同观看这场全球开发者盛会. 关于 GitHub ...