首页 > 其他分享 >N皇后问题

N皇后问题

时间:2024-05-14 20:53:41浏览次数:10  
标签:%- 方案 int 问题 num 皇后 include

递归方式N皇后

#include<stdio.h>  
#include<math.h>

#define N  5  //皇后个数  
int q[N + 1];  //存储每个皇后所在的列数  下标从1开始
int num = 1;  //记录方案数

//输出当前方案的函数
void printQ() {
	printf("方案%-3d: ", num);
	for (int i = 1; i <= N; i++) {
		printf("%d ", q[i]);
	}
	printf("\n");
	num++;
}

//校验摆放位置是否正确
int check(int j) {
	//遍历j之前的所有皇后
	for (int i = 1; i < j; i++) {
		//判断是否在同一列或在对角线
		//同一列: 判断列数是否相等
		//对角线: 行数相减的绝对值与列数相减的绝对值相等
		if (q[i] == q[j] || abs(q[i] - q[j]) == abs(i - j)) {
			//在同一列或对角线
			return 0;
		}
	}

	return 1;
}

//摆放皇后
void queen(int j) {
	//遍历皇后所在行的每列
	for (int i = 1; i <= N; i++) {
		q[j] = i;
		if(check(j)){   //可以放置
			//判断是否是最后一个皇后
			if (j == N) {
				//输出方案
				printQ();
			}else {
				//继续放置下一个皇后
				queen(j + 1);
			}
		}
	}
	//for循环遍历结束说明当前皇后没有可放置的位置,返回到上一个皇后(回溯)
}

int main() {
	queen(1);
	return 0;
}

非递归方式N皇后

#include<stdio.h>  
#include<math.h>

#define N  5  //皇后个数  
int q[N + 1];  //存储每个皇后所在的列数  下标从1开始
int num = 1;

//输出当前方案的函数
void printQ() {
	printf("方案%-3d: ", num);
	for (int i = 1; i <= N; i++) {
		printf("%d ", q[i]);
	}
	printf("\n");
	num++;
}

//校验摆放位置是否正确
int check(int j) {
	//遍历j之前的所有皇后
	for (int i = 1; i < j; i++) {
		//判断是否在同一列或在对角线
		//同一列: 判断列数是否相等
		//对角线: 行数相减的绝对值与列数相减的绝对值相等
		if (q[i] == q[j] || abs(q[i] - q[j]) == abs(i - j)) {
			//在同一列或对角线
			return 0;
		}
	}

	return 1;
}

//摆放皇后
void queen() {
	int j = 1;
	while ( j >= 1 )	{
		//将当前皇后向后移动
		q[j]++;
		//判断是否可以放置皇后
		while (q[j] <= N && !check(j)) {
			q[j]++;
		}

		if (q[j] <= N) {  //当前皇后没有越界,说明皇后放置成功
			//判断当前皇后是否是最后一个皇后
			if (j == N) {
				printQ();
			}else {
				j++;  //放置下一个皇后
			}
		}else{    //皇后越界,回溯
			q[j] = 0;  //将当前皇后的位置重置
			j--;  //回溯到上一个皇后
		}	
	}
}

int main() {
	queen();
	return 0;
}

标签:%-,方案,int,问题,num,皇后,include
From: https://www.cnblogs.com/Liu--blog/p/18192229

相关文章

  • 解决IDEA中.properties文件中文变问号(???)的问题(已解决_OK
    https://blog.csdn.net/m0_50808748/article/details/133185685问题背景构建SpringBoot项目时,项目结构中有一个application.properties文件。这个项目是SpringBoot一个特有的配置文件。内容如下(我写了一些日志的配置):写到这刚好到饭点,我打算回来吃个饭继续写,于是关闭了IDEA当我......
  • k8s 维护有状态服务难的问题,他解决了
        介绍:它是基于Kubernetes的云原生数据基础设施,为用户提供了关系型数据库、NoSQL数据库、向量数据库以及流计算系统的管理控制功能。可以使用提供的命令轻松部署处理数据库实例。github:https://github.com/apecloud/kubeblocks官网:https://kubeblocks.io......
  • 关于npm install报错问题
    npminstall安装报错时,可能的原因有很多,以下是一些常见的解决方法:请记住,解决npm安装问题通常需要具体问题具体分析。根据错误消息和上下文信息,可能需要采用不同的方法来解决问题。清除npm缓存:有时候,npm的缓存可能会导致安装失败。你可以尝试运行npmcacheclean--force命令来......
  • Mysql的max()函数9大于10问题
    前言在公司老项目使用过程中都遇到过这个问题,所以这里记录下来问题描述使用系统中发现系统的字典新增之后排序不固定,于是查找问题,打开数据库发现sort大部分都是"10"mybatis中查询语句如下: `selectIFNULL(MAX(DIC_SORT),0)FROMDIC_INFOWHERE'ProjectId'=#{ProjectId}`......
  • arthas定位接口的耗时排查问题
    下载Arthas的jar包https://arthas.aliyun.com/上传jar包到你的服务器启动启动arthas在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):curl-Ohttps://arthas.aliyun.com/arthas-boot.jarjava-jararthas-boot.jar执行该程序的用户需要和目标进程......
  • 绝对定位(absolute)居中问题:transform: translate(-50%);
     transform:translate(-50%); translate(50%)相当于translateX(50%),表示沿X轴方向平移元素自身宽度的50%。 绝对定位是最常见的问题是难以居中,所以可以改变元素的中心,来达到居中的效果position:absolute;left:50%;transform:translate(-50%); exposit......
  • 内存溢出问题分析与处理
    内存占用情况查询检查系统内存使用情况以GiB为单位进行显示remotecmd"free-g"1.total:物理内存总量(GiB)。2.used:当前已使用的物理内存量(不包括缓冲区和缓存)(GiB)。3.free:可用的物理内存量(GiB)。4.shared:被多个进程共享的内存量(GiB)。5.buff/cache:作为......
  • easyUI datagrid 数据不显示,tablebody 高度为0 的问题
    如下图,接口请求回来数据,表头也显示出来了。打开元素,可以看到table的bbody里面是有数据的,数据也渲染到了页面表格中,但是table的height为0。 排查以下问题:检查数据源格式是否正确,如是JSON数组还是符合easyui要求的对象。确保在datagrid初始化后正确触发数据加载......
  • 【VsCode输出中文乱码问题】用vscode写c/c++时,终端输出结果为中文乱码如何解决?
    前言因为我平时在vscode写代码,在输出语句时,不会出现中文,所以之前一直没有遇到这个问题。但是今天,在练习的时候,涉及到了中文输出,所以遇到了这个中文乱码问题。我在运行代码时,发现代码页面上的中文正常显示,而终端输出的中文却是乱码其实,出现中文乱码是非常常见的事了,比如在浏览......
  • springmvc 解决中文乱码问题
    自定义过滤器自定义实现Filter接口publicclassMyCharacterFilterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}@OverridepublicvoiddoFilter(ServletRequestservletRequest,......