#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 ...
随机推荐
- Vue props用法详解
Vue props用法详解 组件接受的选项之一 props 是 Vue 中非常重要的一个选项.父子组件的关系可以总结为: props down, events up 父组件通过 props 向下传递数 ...
- QTableWidget数据表格
void setRowHeight(int row, int height); //行高 void setVerticalHeaderLabels(const QStringList &lab ...
- mongodump
mongodump工具是MongoDB提供的用来导出数据的工具,具体的用法参考官方文档:https://docs.mongodb.com/manual/reference/program/mongod ...
- Linux ping:unknown host问题排查
一.检查网卡配置:输入ifconfig可以查看当前网卡配置的IP地址并且查看配置文件中网络的设置: [root@bqh- ~]# ifconfig eth0 Link encap:Ethernet H ...
- ORACLE 无法访问表空间
问题描述: Oracle安装后创建用户,建表等都正常,但在插入数据的时候出现无法访问表空间 解决办法: ORACLE12权限管理比较严格需设置分配以下权限 系统权限赋值:unlimited t ...
- TFTP启动内核、设备树,NFS启动FS
一.软硬件平台 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E6321. 二.问题 ...
- MongoDB/聚合/MR
管道与Aggregation: 文档结构如下: { "_id" : 1, "item" : "abc", "price" ...
- linux网络编程之socket编程(一)
今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp ...
- redis开发相关
1.为什么要用缓存,缓存的使用场景2.redis数据存储类型 string/list/set/hash/sort set(zset)3.redis的常用数据类型,使用方式4.redis实现的跳跃表是什 ...
- Spring -10 -<bean>的 scope 属性 -singleton 默认值/prototype 多例 /request /session /application /global session
1.<bean>的属性; 2.作用:控制对象有效范围(单例,多例等)3.<bean/>标签对应的对象默认是单例的. 3.1无论获取多少次,都是同一个对象 Teacher t1 ...