八皇后问题详解(最短代码)

八皇后问题算法分析:
分析1:八皇后由一个64格的方块组成,那么把八个皇后放入不考虑其他情况利用穷举法,有8^64种
可能。
分析2:显然任意一行有且仅有1个皇后,使用数组queen[0->7]表示第i行的皇后位于哪一列。
对于“1->8”这八个字符,调用全排列问题(有8!种情况,虽然数字很大但是比分析1已经大大缩短了
时间),并且加入分支限界的条件判断是否相互攻击即可。
分析2=3:深度优先搜索:将第i个皇后放置在第j列上,如果当前位置与其他皇后相互攻击,则剪枝
掉该节点。
分析对角线:N=8
主对角线上(i-j)为定值,取值范围是-(N-1)<=(i-j)<=(N-1),从而:0<=(i-j+N-1)<=2*N-2;
次对角线上(i+j)为定值,取值范围是0<=(i+j)<=2*N-2;
使用m1[0..2N-2],m2[0..2N-2]记录皇后占据的对角线
上述数据结构与剪枝过程适用于N皇后的问题

代码:





递归调用:

8皇后是个经典的问题,如果使用暴力法,每个格子都去考虑放皇后与否,一共有264 种可能。所以暴力法并不是个好办法。由于皇后们是不能放在同一行的, 所以我们可以去掉“行”这个因素,即我第1次考虑把皇后放在第1行的某个位置, 第2次放的时候就不用去放在第一行了,因为这样放皇后间是可以互相攻击的。 第2次我就考虑把皇后放在第2行的某个位置,第3次我考虑把皇后放在第3行的某个位置, 这样依次去递归。每计算1行,递归一次,每次递归里面考虑8列, 即对每一行皇后有8个可能的位置可以放。找到一个与前面行的皇后都不会互相攻击的位置, 然后再递归进入下一行。找到一组可行解即可输出,然后程序回溯去找下一组可靠解。

我们用一个一维数组来表示相应行对应的列,比如c[i]=j表示, 第i行的皇后放在第j列。如果当前行是r,皇后放在哪一列呢?c[r]列。 一共有8列,所以我们要让c[r]依次取第0列,第1列,第2列……一直到第7列, 每取一次我们就去考虑,皇后放的位置会不会和前面已经放了的皇后有冲突。 怎样是有冲突呢?同行,同列,对角线。由于已经不会同行了,所以不用考虑这一点。 同列:c[r]==c[j]; 同对角线有两种可能,即主对角线方向和副对角线方向。 主对角线方向满足,行之差等于列之差:r-j==c[r]-c[j]; 副对角线方向满足, 行之差等于列之差的相反数:r-j==c[j]-c[r]。 只有满足了当前皇后和前面所有的皇后都不会互相攻击的时候,才能进入下一级递归。

#include <iostream>
using namespace std;int c[20], n=8, cnt=0;
void print(){for(int i=0; i<n; ++i){for(int j=0; j<n; ++j){if(j == c[i]) cout<<"1 ";else cout<<"0 ";}cout<<endl;}cout<<endl;
}
void search(int r){if(r == n){print();++cnt;return;}for(int i=0; i<n; ++i){c[r] = i;int ok = 1;for(int j=0; j<r; ++j)if(c[r]==c[j] || r-j==c[r]-c[j] || r-j==c[j]-c[r]){ok = 0;break;}if(ok) search(r+1);}
}
int main(){search(0);cout<<cnt<<endl;return 0;
}
acm竞赛模板:

#include"iostream"
#include"stdlib.h"
using namespace std;
int x[8],tot=0;
bool B(int x[],int k)
{int i;for(i=0;i<k;i++)if(x[i]==x[k]||(abs(x[i]-x[k])==abs(i-k)))return 0;return 1;
}
int queen(int i)
{if(i>=8){tot++;for(i=0;i<8;i++)cout<<x[i]<<" ";cout<<endl;return 0;}for(int k=0;k<8;k++){x[i]=k;if(B(x,i))queen(i+1);}
}
int main()
{queen(0);cout<<tot<<endl;return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5个编写技巧,有效提高单元测试实践

1. 什么是单元测试 “在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;对于面向对象编程&#xff0c;最…

谈谈我工作中的23个设计模式

序 从基础的角度看&#xff0c;设计模式是研究类本身或者类与类之间的协作模式&#xff0c;是进行抽象归纳的一个很好的速成思路。后面阅读设计模式后&#xff0c;为了加深理解&#xff0c;对相关图片进行了描绘和微调。 从技术的角度已经有很多好的总结&#xff0c;本文会换…

三种方法求最长子序列问题

#include<iostream> #include<algorithm> using namespace std; int maxsum(int a[],int x,int y) {int v,l,r;if(y-x1)//只有一个元素&#xff0c;直接返回 return a[x];int mx(y-x)/2;//分治法第一步&#xff0c;划分成[x,m)和[m,y)int maxsmax(maxsum(a,x,m),ma…

OpenSergo 流量路由:从场景到标准化的探索

流量路由&#xff0c;顾名思义就是将具有某些属性特征的流量&#xff0c;路由到指定的目标。流量路由是流量治理中重要的一环&#xff0c;多个路由如同流水线一样&#xff0c;形成一条路由链&#xff0c;从所有的地址表中筛选出最终目的地址集合&#xff0c;再通过负载均衡策略…

传统 Web 框架部署与迁移

与其说 Serverless 架构是一个新的概念&#xff0c;不如说它是一种全新的思路&#xff0c;一种新的编程范式。 但是原生的 Serverless 开发框架却非常少。以 Web 框架为例&#xff0c;目前主流的 Web 框架“均不支持 Serverless 模式部署”&#xff0c;因此我们一方面要尝试接…

归并排序(视频+详解+代码)

归并排序 概述&#xff1a;归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使…

三款“非主流”日志查询分析产品初探

前言 近些年在开源领域&#xff0c;用于构建日志系统的软件有两类典型&#xff1a; Elasticsearch&#xff1a;基于 Lucene 构建倒排索引提供搜索功能&#xff0c;DocValue 存储支持了其统计分析能力。Clickhouse&#xff1a;列式存储是其优秀 OLAP 性能的保障。 这里把上述系…

C++ Set常用用法

set集合容器&#xff1a;实现了红黑树的平衡二叉检索树的数据结构&#xff0c;插入元素时&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置&#xff0c;以保证每个子树根节点键值大于左子树所有节点的键值&#xff0c;小于右子树所有节点的键值&#xff…

CIPU落地专有云:是“小众需求”还是“机会之门”?

引言&#xff1a;2022年11月&#xff0c;云栖大会主论坛&#xff0c;阿里巴巴集团副总裁、阿里云智能基础产品事业部负责人蒋江伟分享了阿里云专有云的一项新进展 —— CIPU落地飞天企业版。在分析师峰会上&#xff0c;阿里巴巴集团研究员、阿里云专有云总经理刘国华也向分析师…

基于开源 PolarDB-X 打造中正智能身份认证业务数据基座

一、公司及业务介绍 中正智能是全球领先的生物识别和身份认证公司之一。我们曾负责公安部指纹算法国家标准的起草、编写&#xff0c;具备从算法、终端、平台、设计、生产、交付全域自研的能力&#xff0c;拥有多项自主知识产权的产品&#xff0c;并积极与高校合作开展基础研发。…

如何开发一个标准的云原生应用?

从几个数字开始说 IDC 预计到 2024 年&#xff0c;由于采用了微服务、容器、动态编排和 DevOps 等技术&#xff0c;新增的生产级云原生应用在新应用的占比将从 2020 年的 10% 增加到 60%&#xff0c;其中微服务的 workload 在企业内将超过 80% 。上面的四点是云原生时代所代表…

Higress实战: 30行代码写一个Wasm Go插件

前言 在11月15号的直播 《Higress 开源背后的发展历程和上手 Demo 演示》中&#xff0c;为大家演示了 Higress 的 Wasm 插件如何面向 Ingress 资源进行配置生效&#xff0c;本文对当天的 Demo 进行一个回顾&#xff0c;并说明背后的原理机制。 本文中 Demo 运行的前提&#x…

Serverless 的前世今生

从云计算到 Serverless 架构 大家好&#xff0c;我是阿里云 Serverless 产品经理刘宇&#xff0c;很高兴可以和大家一起探索 Serverless 架构的前世今生。 从云计算到云原生再到 Serverless 架构&#xff0c;技术飞速发展的轨迹都有一定规律可循&#xff0c;那么 Serverless 架…

eunomia-bpf 项目重磅开源!eBPF 轻量级开发框架来了

近日&#xff0c;在 2022 云栖大会龙蜥峰会 eBPF & Linux 稳定性专场上&#xff0c;来自 eBPF 技术探索 SIG Maintainer 、浙江大学的郑昱笙分享了《eunomia-bpf&#xff1a;eBPF 轻量级开发框架》技术演讲&#xff0c;以下为本次演讲内容&#xff1a; 大家好&#xff01;…

一文看懂分布式链路监控系统

背景 传统的大型单体系统随着业务体量的增大已经很难满足市场对技术的需求&#xff0c;通过对将整块业务系统拆分为多个互联依赖的子系统并针对子系统进行独立优化&#xff0c;能够有效提升整个系统的吞吐量。在进行系统拆分之后&#xff0c;完整的业务事务逻辑所对应的功能会…

深度 | 新兴软件研发范式崛起,云计算全面走向 Serverless 化

11月3日&#xff0c;2022 杭州 云栖大会上&#xff0c;阿里云智能总裁张建锋表示&#xff0c;以云为核心的新型计算体系正在形成&#xff0c;软件研发范式正在发生新的变革&#xff0c;Serverless 是其中最重要的趋势之一&#xff0c;阿里云将坚定推进核心产品全面 Serverless…

适用场景全新升级!扩展 Dragonfly2 作为分布式缓存系统架构

Dragonfly2 简介 Dragonfly 作为龙蜥社区的镜像加速标准解决方案&#xff0c;是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高大规模文件传输的效率和速率&#xff0c;最大限度地利用网络带宽。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。 现阶段 D…

sdut1197约瑟夫问题

#include <stdio.h> int main( void ) {int n, i 0, m, p,ans;scanf("%d%d", &n, &m); //n总人数&#xff0c;m步长while( i < n ){p i * m;while (p > n)p p - n (p - n - 1)/(m - 1);// printf("%d\n", p);ansp;}printf("…

sdut2056不敢死队问题

#include <stdio.h> int main( void ) {int n;while(scanf("%d",&n),n){int i 0, m5, p,ans,l0;// scanf("%d", &n); //n总人数&#xff0c;m步长while( i < n ){p i * m;while (p > n)p p - n (p - n - 1)/(m - 1);l;if(p1)print…

hdu1257 最少拦截系统【想了好久】

最少拦截系统 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Problem Description某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超…