n皇后问题(分析)
这道题需要用到回溯算法,现在在这里先简单的介绍一下这个算法:
回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。
首先,看一个简单的程序;
#include <stdio.h>
#include <stdlib.h> void function(int a)
{
if (a > )
{
printf("%d\n", a);
function(a - );
}
} int main(void)
{
int a = ;
function();
system("PAUSE");
return ;
}
输出:3 2 1
#include <stdio.h>
#include <stdlib.h> void function(int a)
{
if (a > )
{
function(a - );
printf("%d\n",a);
}
} int main(void)
{
int a = ;
function();
system("PAUSE");
return ;
}
输出:1 2 3
首先第一个不难理解,第二个,首先进行三次递归,分别是function(2),function(1),function(0)=>a=3,a=2,a=1;当到a=1递归执行结束,就会接着往下执行,执行printf,所以此时输出1,然后,返回到上一级递归,function(1),执行结束后,再次执行printf,输出1...
八皇后问题:
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
#include <stdio.h>
#include <stdlib.h> #define max 8//定义最大方格 int a[max],sum=;//定义全局变量 int check_function(int n) { //检查当定一个点时,以行为单位扫描(a[n]为横坐标)遍历其他列的位置是否能满足要求
int i;
for(i=; i<n; i++)/*i<n,而不是i<max,这里用法是:首先定的一个点为起始点,这个点肯定正确,然后对下列扫描,找到,和上一列定那个点一起满足条件的点,接着第三第四列一样,到第八列(max),又找到点时,这时候满足第30行代码的输出条件,输出,找到一组
,接着第26~28行代码,相当于将定点纵坐标加一,进行移位操作,然后到check_function函数中进行与上面类似的操作*/
{
if(a[i]==a[n]||abs(a[i]-a[n])==abs(i-n)) { //a[i]==b[n]表示在同一排的情况,后者为在同一对角线上(记住abs求绝对值函数)
return ;//不满足条件返回1
}
}
return ;//满足条件返回0 } int func(int n) { //定义一个进行对定点改变与输出结果的函数
int i,t;
for(i = ; i < max; i++) {
a[n]=i;//假设的点,当每次满足条件返回1时,会再次进行上面的for循环,对i进行加一操作,相当于对纵坐标操作,下移一位
if(check_function(n)==) { //结合上一个给a[n]赋值,通过判断是否符合条件,让a[n]的值为每一列满足条件的值(纵坐标),n为横坐标
if(n==max-) { //max-1 说的是最后一列,当横坐标数等于最后一列,且满足了检验,就说明这是一组中的最后一个,于是输出满足条件的a[n]
for(t=; t<n; t++)
printf("(%d,%d),",t,a[t]);//这样打印的原因:到这里,每个a[n]实际是满足条件的位置
printf("\n");
sum++;
} else {
func(n+);//若满足了检验,却不满足是最后一项,则说明这只是一组中的一个,且不是最后一个,因为推出结果是按列进行扫描,所以,横坐标向后移一位
}
}
}
} int main(void) {
func();//定横坐标为零
printf("sum=%d\n",sum);//打印出摆放方式数
return ;
}
n皇后问题(分析)的更多相关文章
- 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯
什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...
- 回溯法——求解N皇后问题
问题描写叙述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后.使其不能互相攻击,即随意的两个皇后不能处在允许行.同一列,或允许斜线上. 能够把八皇后问题拓展 ...
- Java 内功修炼 之 数据结构与算法(一)
一.基本认识 1.数据结构与算法的关系? (1)数据结构(data structure): 数据结构指的是 数据与数据 之间的结构关系.比如:数组.队列.哈希.树 等结构. (2)算法: 算法指的是 ...
- [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others) ...
- 八皇后问题详细分析与解答(递归法解答,c#语言描述)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或 ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- 两个NOI题目的启迪8皇后和算24
论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...
- OpenJudge1700:八皇后问题 //不属于基本法的基本玩意
1700:八皇后问题//搜索 总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...
- 2016HUAS暑假集训题1 H - N皇后问题
Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合 ...
随机推荐
- Android Studio NDK环境配置
本文参考:Android Studio NDK环境配置及JNI使用方法:http://blog.csdn.net/tongseng/article/details/53005123 并添加自己的实践: ...
- 在java中对数据库进行增删改查
1.java连接MySql数据库 代码区域: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- 风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转
如果你曾经负责开发企业ERP系统或者OA系统,工作流对你来说一定并不陌生.工作流(Workflow)是对工作流程及其各操作步骤之间业务规则 的抽象.概括.描述.工作流要解决的主要问题是:为实现某个业务 ...
- kafka的api操作(官网http://kafka.apache.org/documentation/#producerapi)
Kafka API 简单用法 本篇会用到以下依赖:(本人包和这个不同,去maven里查找) <dependency><groupId>org.apache.kafka</ ...
- MongoDB整理笔记のID自增长
以下是官网原文地址: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 概要 MongoDB 的_i ...
- IIS 7.5 使用appliaction Initialization
https://blogs.msdn.microsoft.com/amol/2013/01/25/application-initialization-ui-for-iis-7-5/ 待续 正在测试 ...
- C#面向对象的三大基本特征
封装: 封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现(可以使代码更加安全),外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程 ...
- STM32 IAP+Ymodem功能实现(参考官方代码)
IAP:在线升级代码 ,通俗的讲就是通过USART,IIC,或者SPI,USB等等,方式,在程序中升级程序,一般用在远程升级,或者是在PCB板子都安装到模具之后还需要升级代码,这样我们就需要,通过IA ...
- Major OSL changes to catch up
flat_map optimization for runtime specialization: https://github.com/imageworks/OpenShadingLanguage/ ...
- “全栈2019”Java第四十七章:继承与方法
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...