n皇后问题c语言代码_求n的阶乘java代码

n皇后问题c语言代码_求n的阶乘java代码问题描述:有一个n*n的棋盘,在这个棋盘中放n个皇后,使得这n个皇后,任意两个皇后不在同一行,同一列,同一条对角线。例如,当n等于4时,有两种摆法。输入只有一个整数n。思路如果我们是从这个n*n这个棋盘中选取n个方格放皇后,再去判断是否满足条件的话,则效率会非常低,这是一个组合数∁\complement∁nn∗nn\atopn*nn∗nn​,当n等于8时,就要枚举54502232次…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

问题描述:

有一个n*n的棋盘,在这个棋盘中放n个皇后,使得这n个皇后,任意两个皇后不在同一行,同一列,同一条对角线。例如,当n等于4时,有两种摆法。
图
输入只有一个整数n。

思路

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

方法一:递归暴力法

做这个题之前,我们回想一下字符串全排列,这个和它相似,可以枚举每一行的列数,枚举完一个棋盘后,判断任意两个皇后是否在同一条线上,例如上面的摆法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;
}
方法二:递归回溯法

上面的方法一是当形成一个n*n的棋盘时,才去判断是否满足条件。
而我们在递归时,可以提前判断是否满足条件,如果不满足,则不用递归下去,返回上一层进行处理,这种方法称为回溯法。这个题是当我们递归的时候就去判断当前的皇后是否和前面的皇后在一条对角线上,如果在一条直线上,就不需要递归下去了,返回上一层;如果不在,就继续递归,下一个继续进行判断,直到满足条件为止。

代码
#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/187628.html原文链接:https://javaforall.net

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


相关推荐

  • 如何在虚拟机上安装win10系统_虚拟机安装系统的步骤

    如何在虚拟机上安装win10系统_虚拟机安装系统的步骤有些用户为了在自己的win10系统上检测一些软件,通常情况会给自己安装一个xp系统虚拟机,这样也能避免测试程序对于主系统的损害,可是win10安装xp虚拟机怎么做呢?接下来小编就带大家来了解一下win10安装xp虚拟机详细步骤。具体方法:1、首先你得去下载一个想要装载在虚拟机上的系统,一定要下载扩展名为.iso的文件。2、然后再去下载一个VMwareWorkstation的虚拟机安装软件,3、然…

    2022年8月16日
    13
  • pytest 执行用例_测试用例执行结果有哪些

    pytest 执行用例_测试用例执行结果有哪些前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年7月30日
    7
  • python jinja2_Python模块学习 – jinja2

    python jinja2_Python模块学习 – jinja2转置 https www cnblogs com dachenzi p 8242713 html 模板要了解 jinja2 那么需要先理解模板的概念 模板在 Python 的 web 开发中广泛使用 它能够有效的将业务逻辑和页面逻辑分开 使代码可读性增强 并且更加容易理解和维护 模板简单来说就是一个其中包涵占位变量表示动态的部分的文件 模板文件在经过动态赋值后 返回给用户 gt 可以理解为渲染

    2025年5月21日
    2
  • 详细介绍如何在ubuntu20.04中安装ROS系统,以及安装过程中出现的常见错误的解决方法,填坑!!!

    详细介绍如何在ubuntu20.04中安装ROS系统,以及安装过程中出现的常见错误的解决方法,填坑!!!  1、添加ROS软件源   将以下命令复制到ubuntu的终端执行sudosh-c’echo”debhttp://packages.ros.org/ros/ubuntu$(lsb_release-sc)main”>/etc/apt/sources.list.d/ros-latest.list’  2、添加密钥   将以下命令复制到ubuntu的终端执行sudoapt-keyadv–keyserver’hkp://keyserver.ubuntu.

    2022年6月26日
    78
  • Java语言冒泡排序详解

    Java语言冒泡排序详解基于很多同学在面试的过程中被问到一些基础的算法,导致整个面试过程不理想,而基础的算法和数据结构往往都是一些大公司任职的基本要求,这也严重影响拿offer的成功率。接下来的一段时间我将陆续对一些简单的基础的算法和数据结构进行详细说明。我将从排序算法说起,下面从冒泡排序开始说起。排序结果:数据从小到大。首先说一下冒泡排序的思想:每次比较从第一个数据开始,数据两两比较,如果左边数据比右边数据大,则交换左右

    2022年6月20日
    26
  • 3D相册薄管理软件DOWNLOAD

    3D相册薄管理软件DOWNLOAD

    2021年8月11日
    54

发表回复

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

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