N皇后问题(c语言实现)

N皇后问题(c语言实现)问题描述 有一个 n n 的棋盘 在这个棋盘中放 n 个皇后 使得这 n 个皇后 任意两个皇后不在同一行 同一列 同一条对角线 例如 当 n 等于 4 时 有两种摆法 输入只有一个整数 n 思路如果我们是从这个 n n 这个棋盘中选取 n 个方格放皇后 再去判断是否满足条件的话 则效率会非常低 这是一个组合数 complement nn nn atopn nn nn 当 n 等于 8 时 就要枚举次

问题描述:

思路

如果我们是从这个n*n的棋盘中选取n个方格放皇后,再去判断是否满足条件的话,则效率会非常低,这是一个组合数 ∁ \complement n n ∗ n n \atop n*n nnn,当n等于8时,就要枚举次

方法一:递归暴力法

做这个题之前,我们回想一下字符串全排列,这个和它相似,可以枚举每一行的列数,枚举完一个棋盘后,判断任意两个皇后是否在同一条线上,例如上面的摆法1(2413).这个方法的复杂度为n!

代码
#include<stdio.h> #include<math.h> int rank[15];//pos列i行  bool vis[15];//标记第i行是否走过 int n,cnt=0; void dfs(int pos){ 
    if(pos==n+1){ 
    bool flag=true; for(int i=1;i<=n;i++){ 
    bool flag2=true; for(int j=i+1;j<=n;j++){ 
   //枚举任意两个皇后  if(abs(i-j)==abs(rank[i]-rank[j])){ 
   //两个皇后处于一条对角线  flag=false; flag2=false; break; } } if(flag2==false) break;//如果一个填满情况对角线有两个或以上,则直接跳出循环  } if(flag) cnt++; return; } for(int i=1;i<=n;i++){ 
   //枚举每一行  if(vis[i]==false){ 
   //第i行没走过  rank[pos]=i;//pos列在i行  vis[i]=true; dfs(pos+1);//递归下一列  vis[i]=false; } } } int main(){ 
    scanf("%d",&n); dfs(1);//从第一列开始枚举  printf("%d",cnt); return 0; } 
方法二:递归回溯法
代码
#include<stdio.h> #include<math.h> int rank[20]; bool vis[20]; int n,cnt=0; void dfs(int pos){ 
    if(pos==n+1){ 
   //递归边界条件  cnt++; return; } for(int i=1;i<=n;i++){ 
   //枚举每行  if(vis[i]==false){ 
    bool flag=true; for(int j=1;j<pos;j++){ 
   //枚举pos之前的皇后  if(abs(pos-j)==abs(i-rank[j])){ 
    flag=false; break; } } if(flag){ 
    rank[pos]=i;//pos列在i行  vis[i]=true; dfs(pos+1); vis[i]=false; } } } } int main(){ 
    scanf("%d",&n); dfs(1); printf("%d",cnt); return 0; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232910.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 更新jsp需要重启tomcat(如何看tomcat的端口)

    今天自己搭建的spring+springmvc+mybatis时,发现修改的Jsp页面静态数据,刷新页面不能及时生效,需要重启tomcat才能生效。把解决方法归纳如下:1、选择tomcat设置:2、进行如下设置:说明:on‘update‘action:当用户主动执行更新的时候更新    快捷键:Ctrl+F9onframedeactication:在编辑窗口失去焦点的时候更新你可以根据…

    2022年4月15日
    105
  • pytest的使用_子程序调用次数不管用

    pytest的使用_子程序调用次数不管用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月28日
    8
  • js 浮动广告代码

    js 浮动广告代码

    2026年1月29日
    3
  • 【运维篇】resize2fs命令 – 调整文件系统大小

    【运维篇】resize2fs命令 – 调整文件系统大小resize2fs命令是用来增大或者收缩未加载的“ext2/ext3/ext4”文件系统的大小。语法格式:resize2fs[参数][文件]常用参数:-d 打开调试特性 -p 打印已完成的百分比进度条 -f 强制执行调整大小操作,覆盖掉安全检查操作 -F 开始执行调整大小前,刷新文件系统设备的缓冲区 参考实例调整逻辑卷文件系统大小:[root@linuxcool~]#resize2fs/dev/linuxprobe/vo打开调试特性

    2022年10月21日
    3
  • densenet网络结构详解_网络dea模型

    densenet网络结构详解_网络dea模型网络基本结构 我们放大一下DenseBlockDenseBlock 上图中每一次的输入都是经过Channel-wiseconcatenation后的,如k0+k,k为growthrate。denseblock一个核心的点就是:每一层的输入来自前面所有层的输出。如下,H2的输入=最开始的输入 + H1的输出= k0+kH3的输入=最开始的输入 …

    2022年9月1日
    6
  • tf版安装_国际贸易术语2010图解

    tf版安装_国际贸易术语2010图解TFS2010安装环境是操作系统为WindowsServer2003SP2(X86),WindowsServer2003R2(X86),WindowsServer2003R2SP2(X86),WindowsServer2008,WindowsServer2008R2。必备组件为:IIS,SQLServer2008,SharePoint(WindowsShare

    2022年9月23日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号