八皇后问题(C语言)

了解题意

在一个8x8的棋盘上放置8个皇后,使得任何两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种方法可以放置这8个皇后?

解决这个问题的目标是找到所有符合要求的皇后摆放方式,通常使用回溯算法来求解。回溯算法会尝试所有可能的摆放方式,一旦发现某个摆放方式会导致冲突(即两个皇后在同一行、同一列或同一斜线上),就立即回溯到上一步,尝试其他的摆放方式。

八皇后问题的解法有很多种,其中一个经典解法是使用递归和剪枝。在递归过程中,算法会尝试在每一行放置一个皇后,并检查是否与前面放置的皇后发生冲突。如果发生冲突,就回溯到上一行重新放置皇后。如果没有发生冲突,就将该摆放方式加入到结果集中。为了避免重复计算,可以使用一个数组来记录已经放置的皇后所在的行和列,以便在回溯时跳过已经计算过的摆放方式。


放置皇后的地方置为1,其余置为0.


代码如下(示例):

#include <stdio.h>
int cnt=0;//解法个数
int qq[8][8]={0};
void cout_cheek(int aa[][8],int n){//输出二维数组for(int i=0;i<n;i++){for(int j=0;j<n;j++){printf("%d ",aa[i][j]);}printf("\n");}printf("\n");
}int notdanger(int qq[][8],int n,int k){//判断某位置是否安全for(int i=0;i<n;i++){if(qq[i][k]==1) return 0;//该列}for(int i=n,j=k;i>=0&&j>=0;i--,j--){//左上角if(qq[i][j]==1) return 0;}for(int i=n,j=k;i>=0&&j<8;i--,j++){//右上角if(qq[i][j]==1) return 0;}return 1;
}
void queen(int qq[][8],int n){
if(8==n){cnt++;printf("第%d种答案:\n",cnt);cout_cheek(qq,8);}else{for(int k=0;k<8;k++){if(notdanger(qq,n,k)){qq[n][k]=1;queen(qq,n+1);qq[n][k]=0;}}}
}
int main(){queen(qq,0);printf("cnt==%d\n",cnt);return 0;
}

递归和回溯是经典算法。


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

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

相关文章

56.网游逆向分析与插件开发-游戏增加自动化助手接口-通过UI分析自动药水设定功能

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一节内容&#xff1a;自动药水设定功能的逆向分析-CSDN博客 这次是假设没有之前的思路积累的话&#xff0c;怎样去找按钮事件。 通过ui当做切入点去做&#xff0c;就是一个窗口它显示不显示&#xff0c;游戏怎样控制这个…

STL——集合算法

算法简介&#xff1a; set_intersection // 求两个容器的交集set_union // 求两个容器的并集set_difference // 求两个容器的差集 1.set_intersection 函数原型&#xff1a; set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);…

史上最好用的SSH工具,好用到超出你的想象

给大家推荐一个功能强大&#xff0c;跨平台切风格很现代化的SSH管理工具——Xterminal。 1、功能特点 布局自由 命令管理 酷炫皮肤 在线编辑 文件上传方式多样 本地融合显示 支持rzsz 文件断点上传 服务器监控 2、来吧&#xff0c;展示 布局自由 双击修改标题 自…

.FileZilla的使用和主动模式被动模式介绍

FileZilla的使用和主动模式被动模式介绍 1.FileZilla的使用和主动模式被动模式介绍1.安装下载2.新建组和用户2.1打开后出现如下界面2.2点击编辑打开组这个选项2.3点击添加组以后&#xff0c;点击确认2.4输入组的名称&#xff0c;列如我输入的niyin2.5点击用户选项2.6像上面一样…

【owt-server】一些构建项目梳理

【owt-server】清理日志&#xff1a;owt、srs、ffmpeg 【owt】p2p client mfc 工程梳理【m98】webrtc vs2017构建带符号的debug库【OWT】梳理构建的webrtc和owt mfc工程 m79的mfc客户端及owt-client

K8S容器的一则故障记录

一、故障现象 XXX反馈说某某业务服务异常&#xff0c;无法启动&#xff0c;需要进行协助排查。经常会接到这样一个需求&#xff0c;一开始无法清楚知道具体什么问题&#xff0c;需要跟一线运维人员详细做沟通&#xff0c;了解故障问题的细节。 根据一线运维人员的反馈&#xff…

git基础概念和常用命令(日常开发收藏备用)

目录 ### 常用命令 ### 远程仓库与克隆 ### 分支管理 ### 子模块&#xff08;Submodule&#xff09; ### 其他高级操作 ### 交互式暂存&#xff08;Interactive Staging&#xff09; ### cherry-pick ### rebase ### reflog与reset ### 子树合并&#xff08;Subtree …

Spring Data Redis对象缓存序列化问题

相信在项目中&#xff0c;你一定是经常使用 Redis &#xff0c;那么&#xff0c;你是怎么使用的呢&#xff1f;在使用时&#xff0c;有没有遇到同我一样&#xff0c;对象缓存序列化问题的呢&#xff1f;那么&#xff0c;你又是如何解决的呢&#xff1f; Redis 使用示例 添加依…

IntelliJ IDEA常用快捷键

【1】创建内容&#xff08;新建&#xff09;&#xff1a;altinsert 【2】main方法&#xff1a;psvm 【3】输出语句&#xff1a;sout 【4】复制行&#xff1a;ctrld 【5】删除行&#xff1a;ctrly&#xff08;很多编辑器ctrly是前进操作&#xff0c;如果选择 Delete Line&…

40道MyBatis面试题带答案(很全)

1. 什么是MyBatis &#xff08;1&#xff09;Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接…

C++编程中级阶段

目录 1.模版 1.1函数模版 1.1.1函数模版语法 1.1.2函数模版注意事项 1.1.3函数模版案例 1.1.4普通函数与函数模板的区别 1.1.5普通函数与函数模板的调用规则 1.1.6模版的局限性 1.2类模版 2.STL处识 3.STL常用容器 3.1string容器 3.2vector容器 3.3deque容器 3.…

工作中常用的 git 命令

了解版本控制 什么是版本控制?我真的需要吗?版本控制是一种记录若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 什么是分布式版本控制系统分布式版本控制系统( Distributed Version Control System&#xff0c;简称 DVCS )。 在这类系统中&#xff0c;像…