#C++初学记录(N皇后#回溯递归)
<font size=5 face"微软雅黑">N皇后Problem Description
<font size=4 face"微软雅黑">在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
<font size=5 face"微软雅黑">Input
<font size=4 face"微软雅黑">共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
<font size=5 face"微软雅黑">Output
<font size=4 face"微软雅黑">共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
<font size=5 face"微软雅黑">Sample Input
<font size=4 face"微软雅黑">1
8
5
0
<font size=5 face"微软雅黑">Sample Output
<font size=4 face"微软雅黑">1
92
10
<font size=5 face"微软雅黑">正确代码(暴力解)
#include<iostream>
#include<cmath>
using namespace std;
int n,sum;
int que[100];
void quee(int k)
{
if(k==n)
{
sum++;
}
for(int i=0;i<n;i++)//尝试摆放第k行皇后的位置。 这里是第i列。
{
int j;
for(j=0;j<k;j++)//和已经摆好的k个皇后比较,查看是否冲突。
{
if(que[j]==i||abs(que[j]-i)==abs(k-j))//列的差和行的差绝对值相同则说明他们能互相吃到。
break;
}
if(j==k){
que[k]=i;//将第k个皇后摆放在位置i。k->行,i->列。
quee(k+1);
}
}
}
int main()
{
cin>>n;
quee(0);
cout<<sum;
}
<font size=5 face"微软雅黑">代码理解
<font size=4 face"微软雅黑">解决n皇后问题的主要思路是如何摆放皇后的位置使八个皇后都不会有生命危险,八皇后的核心代码是如何判断皇后的摆放位置,即
if(que[j]==i||abs(que[j]-i)==abs(k-j))//列的差和行的差绝对值相同则说明他们能互相吃到。
break;
这一判断,其中前者是判断皇后是否在同一列,后者是判断皇后是否在对角线上,对角线的判断是两个皇后之间的行之差是否等于列之差,若相等则在对角线上,八皇后的回溯递归问题比较抽象,他使用两层嵌套for循环进行行和列的判断,第i行,第j列,在for循环外面的
if(k==n)
{
sum++;
}
并不会显得不能理解,因为在一层一层递归之后,计算机最终找到了其中之一的安置方法,这是由n个递归进行的判断,当第n个递归表示第n个皇后可以安放后,第n+1次递归就会进行这个if判断,然后sum+1,之后递归回溯到j次循环内继续进行循环,之后j循环完毕,继续回溯到i次循环。
#C++初学记录(N皇后#回溯递归)的更多相关文章
- 2553 ACM N皇后 回溯递归
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2553 中文题目,题意很简单. 思路:听说这是学习递归的经典题目,就来试试,发现自己一点想法都没有,一遇到递 ...
- #C++初学记录(深度搜索#递归)
深度搜索 走地图的题目是深度搜索里比较容易理解的题目,更深层次的是全排列和七皇后等经典题目,更加难以理解,代码比较抽象. 题目:红与黑 蒜厂有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖. ...
- YTU 3013: 皇后问题(递归)
3013: 皇后问题(递归) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...
- 2n皇后 - 回溯
题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...
- 再谈循环&迭代&回溯&递归&递推这些基本概念
循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...
- N皇后问题--递归回溯
著名的N皇后问题,就是先按照行一行一行的找,先找第一行,第一行找到一列能满足条件,继续找下一行,如果下一行也找到一列能满足条件,继续找下一行,一次类推,最终找到解, 但是,如果找不到的话, 就说明上一 ...
- #C++初学记录(阶乘#递归)
练习题目三 用递归进行阶乘 运行代码 #include<iostream> using namespace std; int f(int n); int n; int main() { c ...
- js实现八皇后,回溯法
八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决. 从第一行选个位置开始放棋 ...
- java实现八皇后问题(递归和循环两种方式)
循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVA ...
随机推荐
- 中兴软开C++面经(一站式西安)- 2019秋招
大概是9.6发短信邀请面试,但是6号有三个面试+一个在线笔试,就打算先去平安产险,看中途能不能再面个云从,中兴后面再面.然而,平安等了差不多4个小时才面完,期间云从面试官打来电话,只能说抱歉.中兴本来 ...
- 【kafka】安装部署kafka集群(kafka版本:kafka_2.12-2.3.0)
3.2.1 下载kafka并安装kafka_2.12-2.3.0.tgz tar -zxvf kafka_2.12-2.3.0.tgz 3.2.2 配置kafka集群 在config/server.p ...
- 【JUC】4.Synchronized与ReentrantLock对比
与synchronized相同,ReentrantLock也是一种互斥锁: synchronized与ReentrantLock的对比: 都是可重入锁 可以再次获取自己的内部锁,即:一个线程获取某对象 ...
- Apache 安装后Error 403的故障排错方法(linux)
Apache 安装后Error 403的故障排错方法 2018年01月07日 14:25:41 个人分类: Linux 一.问题描述 在apache2的httpd配置中,很多情况都会出现403. 刚安 ...
- 复习巩固:oracle如何实现去重和分页
一:oracle实现去重: user数据表: 分两步:1.查询重复数据 2.删除重复数据 1.查询重复数据:在oracle中实现查询重复数据,可以借助于rowid这个伪列.oracle中每个表物理上 ...
- spark HMM
Scala实现的: https://github.com/skrusche63/spark-intent/tree/master/src/main/scala/de/kp/scala/hmm http ...
- gdb调试(一)
对于gdb是什么,这里就不多说了,只要是程序员一般都听说过,像java开发会用到集成开发工具eclipse,里面调试起来非常方便,全是可视化的,但是如果在linux下编写的c程序,用可视化的调试就没这 ...
- GT源码阅读
昨天读了一点GT的代码,做个笔记. 参考阅读顺序:https://gt.qq.com/docs/a/UseGtWithBroadcast.txt 在上面的doc上面找到了对应的板块的代码. 1.采集本 ...
- LG5487 【模板】线性递推+BM算法
[模板]线性递推+BM算法 给出一个数列 \(P\) 从 \(0\) 开始的前 \(n\) 项,求序列 \(P\) 在\(\bmod~998244353\) 下的最短线性递推式,并在 \(\bmod~ ...
- python之钉钉机器人zabbix报警
转自:https://blog.51cto.com/m51cto/2051945 首先在钉钉群聊里添加一个自定义的机器人 并复制webhook的内容 https://oapi.dingtalk.com ...