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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vmware workstation怎么使用虚拟机_虚拟机的使用方法

    vmware workstation怎么使用虚拟机_虚拟机的使用方法本文参照:https://www.linuxidc.com/Linux/2017-03/141972.htmVMwareWorkstation虚拟机使用方法图文详解云最成熟的架构是IaaS(I

    2022年8月6日
    11
  • 学习 Spring Boot 知识看这一篇就够了

    学习 Spring Boot 知识看这一篇就够了从2016年因为工作原因开始研究SpringBoot,先后写了很多关于SpringBoot的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分是在技术社区做的系列课程。我在写文章的时候将文章中的示例提取出来,作为开源代码分享了出来让大家以更方便的方式去学习(https://github.com/ityouknow/spri…

    2022年7月15日
    21
  • 2.6 从JSON数据源导入数据

    2.6 从JSON数据源导入数据2.6从JSON数据源导入数据1、如何读取json格式的数据在开始之前,需要安装requests模块案例:读取并解析GitHub(http://github.com)网站的最近活动时间表2、操作步骤指定GitHubURL来读取JSON格式数据使用requests模块访问指定的URL,并获取内容读取内容并将之转化为JSON格式的对象迭代访问JSON对象3、代码实现importrequestsimportjsonurl=’https://github.com/ti

    2022年6月19日
    28
  • discuz php接口文档,Discuz二次开发手册.doc[通俗易懂]

    discuz php接口文档,Discuz二次开发手册.doc[通俗易懂]Discuz二次开发手册Discuz文件说明,有助于discuz爱好者,进行自己的开发,在这里提供方便admincp.php——后台系统设置主程序文件,一般只处理菜单的显示的访问权限,不处理管理控制。ajax.php——论坛模板的ajax判断及数据返回都在这里进行attachment.php——附件文件,仅仅处理附件下载的功能。announcement.php——论坛公告的显示,一般很少改con…

    2022年5月19日
    42
  • Java学习之动态代理篇

    Java学习之动态代理篇0x00前言在后面的漏洞研究的学习中,必须要会的几个知识点。反射机制和动态代理机制。至于反射的前面已经讲到过了,这里就不做更多的赘述了。0x01动态代理这里先来讲一

    2021年12月12日
    56
  • window.top.location.href 和 window.location.href 的区别

    window.top.location.href 和 window.location.href 的区别

    2021年10月9日
    46

发表回复

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

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