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


相关推荐

  • Java面向对象之创建和使用对象——定义学生/教师类并输出相关信息

    Java面向对象之创建和使用对象——定义学生/教师类并输出相关信息学生类importjava.util.Scanner;publicclassStudent{Stringname=”张三”;intage=16;Stringgrade=”三年二班”;Stringfancy=”打篮球唱歌读书冒险”;publicvoidintroduce(){System.out.println(“————————————-

    2022年7月8日
    23
  • Java对象数组

    Java对象数组所谓的对象数组,就是指包含了一组相关的对象,但是在对象数组的使用中一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据类型,所以数组里面的每一个对象都是null值,则在使用的时候数组中的每一个对象必须分别进行实例化操作。 对象数组的声明先定义,再开辟空间类名称对象数组名[]=null;对象数组名=new类名称[长度]; 定义并开辟数组类名称对象数…

    2022年5月5日
    45
  • linux删除用户命令userdel

    linux删除用户命令userdeluserdel命令默认只会删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。如果加上-r参数,userdel会删除用户的HOME目录以及邮件目录。例子:默认情况下:[root@localhosthome]#useraddzhanglulu4[root@localhosthome]#lselasticsearchftp-userhbk…

    2022年6月7日
    40
  • 圆柱体积怎么算立方公式_圆柱怎么算立方?

    圆柱体积怎么算立方公式_圆柱怎么算立方?展开全部圆柱体的立方就是求圆柱体的体积。公式为:1、圆柱定义在同一个平面内有一条定直线和一条动线e69da5e887aa3231313335323631343130323136353331333363396363,当这个平面绕着这条定直线旋转一周时,这条动线所成的面叫做旋转面,这条定直线叫做旋转面的轴,这条动线叫做旋转面的母线。如果母线是和轴平行的一条直线,那么所生成的旋转面叫做圆柱面。如果用垂直…

    2026年2月4日
    5
  • Vue生命周期详解

    Vue生命周期详解目录前言 一 生命周期流程图详解 1 beforeCreate Created2 编辑模板过程 3 beforeMount Mounted4 beforeUpdate Updated5 beforeDestro Destroyed 二 生命周期代码 1 父子组件加载生命周期 2 父子组件更新生命周期 3 父子组件销毁生命周期前言 1 什么是 vue 生命周期 Vue 实例从创建到销毁的过程 就是生命周期 也就是从开始创建 初始化数据 编译模板 挂载 Dom 渲染 更新

    2026年3月18日
    3
  • r语言绘图参数(R语言plot画图)

    过去一个月实验比较忙,很久没有写点东西了,今天要给amina画图,因此学习了一下R语言的基础画图。ide1.plot函数函数plot(x,y,xlim=c(0,100),ylim=c(0.4,1),type=”o”,lwd=2,col=2,pch=24,cex=1.5,yaxs=”i”,xaxs=”i”,xlab=”SampleRation(%)”,ylab=”Accuracy…

    2022年4月10日
    56

发表回复

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

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