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)
上一篇 2025年9月1日 下午12:01
下一篇 2025年9月1日 下午12:22


相关推荐

  • 算法学习网站推荐

    算法学习网站推荐博主最近在学算法,看了很多不错的文章,顺便推荐几个写的不错的网站~我会慢慢更新1、基础算法学习清单~2、基础的数据结构!3、杂七杂八的算法学习~(这位博主写的东西很杂但是还是不错的)4、ACM习题!5、约瑟夫环问题~(简单的问题也有非常巧妙的解法,这位博主改的一个优化算法非常有意思)6.、A*算法7、LeetCode(这个应该大家都知道,刷题网站)8、我个人g…

    2022年6月19日
    76
  • 逆波兰法表示的表达式_波兰表达式和逆波兰

    逆波兰法表示的表达式_波兰表达式和逆波兰根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1:输入:tokens = [“2″,”1″,”+”,”3″,”*”]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入:tokens = [“4″,”13″,”5″,”/”,”+”]输

    2022年8月9日
    12
  • PHP资料2:_王中王资料

    PHP资料2:_王中王资料其他方面:PHP在数据库方面的丰富支持,也是它迅速走红的原因之一,它支持下列的数据库或是数据文件:Adabas、D、DBA、dBase、dbm、filePro、Informix、Inte

    2022年8月4日
    12
  • js如何在控制台打印?

    js如何在控制台打印?转自 http blog csdn net cy88310 article details 在 js 中右中全局方法可以在控制台 console 中打印信息 1 console log 11 2 console info 11 3 console warn 33 4 console error 55 在浏览器端 按下 F12 可以打开浏览器的 con

    2026年3月26日
    2
  • AI智能体扣子(Coze)工作流搭建:Coze 工作流1天高效创作100篇知识图文,保姆级教程

    AI智能体扣子(Coze)工作流搭建:Coze 工作流1天高效创作100篇知识图文,保姆级教程

    2026年3月13日
    2
  • nonlocal用法

    nonlocal用法这个 nonlocal 是 py3 x 中才有的关键词第一种情况 不使用 nonlocal 的情况 encoding utf 8 importsysrel sys sys setdefaulten utf 8 deftest x 1print test str x

    2026年3月16日
    3

发表回复

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

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