算法学习->递归典例N皇后问题
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皇后问题的更多相关文章
- DFS 深搜专题 入门典例 -- 凌宸1642
DFS 深搜专题 入门典例 -- 凌宸1642 深度优先搜索 是一种 枚举所有完整路径以遍历所有情况的搜索方法 ,使用 递归 可以很好的实现 深度优先搜索. 1 最大价值 题目描述 有 n 件物品 ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- 算法学习之C语言基础
算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...
- 数据结构学习之栈求解n皇后问题
数据结构学习之栈求解n皇后问题 0x1 目的 深入掌握栈应用的算法和设计 0x2 内容 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 算法学习之快速排序的C语言实现
近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...
- 数据挖掘算法学习(八)Adaboost算法
本文不定期更新.原创文章,转载请附上链接http://blog.csdn.net/iemyxie/article/details/40423907 谢谢 Adaboost是一种迭代算法,其核心思想是针 ...
- Java实现 蓝桥杯VIP 算法提高 递归倒置字符数组
算法提高 递归倒置字符数组 时间限制:1.0s 内存限制:512.0MB 问题描述 完成一个递归程序,倒置字符数组.并打印实现过程 递归逻辑为: 当字符长度等于1时,直接返回 否则,调换首尾两个字符, ...
随机推荐
- 初探计算机网络之TCP/IP网络协议
网络协议 在计算机诞生以来,从最原始的单机模式到现在多台计算机协同工作,形成计算机网络,从前很难想象的信息共享.多机合作.大规模计算在今天也早已成了现实.在早期,计算机网络需要解决的痛点,就是怎样 ...
- 数字图像处理(一)之灰度转换和卷积python实现
使用Python实现数字图像处理中如下功能: 彩色图像转成灰度图像 实现图像的相关&卷积操作 实现图像的高斯核卷积 使用的库和python版本如下: imageio:2.9.0 用于读取磁盘中 ...
- Serverless 如何在阿里巴巴实现规模化落地?
作者 | 赵庆杰(卢令) 来源 | Serverless 公众号 一.Serverless 规模化落地集团的成果 2020 年,我们在 Serverless 底层基建上做了非常大的升级,比如计算升级到 ...
- Java初步学习——2021.10.11每日总结,第六周周一
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天继续学习菜鸟教程Java实例 字符串 9.字符串小写转大写--toUpperCase方法 public class Ma ...
- 创建HTML文档
目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...
- 海信A6/A6L A7Pro/CC A5PRO/A5PRO CC 安装gms google service指南
用过海信双面屏或者eink手机的朋友都知道,海信手机就是死活安装不了谷歌全家桶,因为海信的领导说跟谷歌有协议不能安装谷歌框架(还说后期google审核坚决不给安装,人家其他ov mui都可以安装).不 ...
- javascript-jquery对象的css处理
一.css基本属性处理 1.css()方法:获取css属性值.$("选择器").css(name);//获取匹配选择器的元素指定css属性值. 2.css()方法:设置css属性值 ...
- Linux argc,argv详解
来源:微信公众号「编程学习基地」 @ 目录 argc,argv是什么 如何解析程序参数 "选项"是什么? "选项字符串"是什么 解析参数 argc,argv是什 ...
- UI自动化测试之Airtest
官方文档: https://airtest.doc.io.netease.com/ 本文我们讲解下Airtest的使用,主要学习目标有以下几点: (1)认识Airtest (2)了解Airtest能做 ...
- py3.8安装
ubantu python3.8# 命令下载wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz#解压tar -xvJf P ...