UVa524 Prime Ring Problem(素数环)

news2024/9/24 4:36:05

1、题目

在这里插入图片描述

2、题意

输入正整数 n n n,把整数1,2,3,…,n 组成一个环,使得相邻两个整数之和均为素数。输出时从整数 1开始逆时针排列。同一个环应恰好输出一次。 n ≤ 16 n \le 16 n16

3、分析

由模型不难得到:每个环对应于 1 ~ n 的一个排列,但排列总数高达 16! = 2 * 1013,生成-测试法会超时吗?进行实验:

for (int i = 2; i <= n * 2; i++) 
	isp[i] = is_prime(i);//生成素数表,加快后续判断
	
for (int i = 0; i < n; i++) 
	A[i] = i + 1; //第一个排列
	
do {
	int ok = 1;
	for (int i = 0; i < n; i++) 
		if(!isp[A[i] + A[(i + 1) % n]]) {  //判断合法性
			ok = 0; 
			break; 
		}

	if(ok) {
		for(int i = 0; i < n; i++) 
			printf("%d ", A[i]); //输出序列
		printf("\n");
	}
} while(next_permutation(A + 1, A + n)); //1的位置不变

运行后发现,当 n = 12 时就已经很慢,而当 n = 16 时无法运行出结果。下面试试回溯法:

void dfs(int cur){
	if (cur == n && isp[A[0] + A[n-1]]) { //递归边界。别忘了测试第一个数和最后一个数
		for (int i = 0; i < n; i++) printf("%d ", A[i]); //打印方案
		printf("\n");
	} else {
		for (int i = 2; i <= n; i++) //尝试放置每个数i
			if(!vis[i] && isp[i + A[cur - 1]]){ //如果i没有用过,并且与前一个数之和为素数
				A[cur] = i;
				vis[i] = 1; //设置使用标志
				dfs(cur + 1);
				vis[i] = 0; //清除标志
			}
	}
}

回溯法比生成-测试法快了很多,即使 n = 18 速度也不错。将上面的函数名设为 dfs 并不是巧合——从解答树的角度讲,回溯法正是按照深度优先的顺序在遍历解答树。

提示:如果最坏情况下的枚举量很大,应该使用回溯法而不是生成-测试法。

4、代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int is_prime(int x) {
	for(int i = 2; i * i <= x; i++)
    	if(x % i == 0) return 0;
  	return 1;
}

int n, A[50], isp[50], vis[50];
void dfs(int cur) {
	if(cur == n && isp[A[0]+A[n-1]]) {
    	for(int i = 0; i < n; i++) {
      		if(i != 0) printf(" ");
      		printf("%d", A[i]);
    	}
    	printf("\n");
  	} else {
  		for(int i = 2; i <= n; i++)
    		if(!vis[i] && isp[i+A[cur-1]]) {
      			A[cur] = i;
      			vis[i] = 1;
      			dfs(cur+1);
      			vis[i] = 0;
    		}
   	}
}

int main() {
	int kase = 0;
  	while(scanf("%d", &n) == 1 && n > 0) {
    	if(kase > 0) printf("\n");
    	printf("Case %d:\n", ++kase);
    	for(int i = 2; i <= n*2; i++) isp[i] = is_prime(i);
    	memset(vis, 0, sizeof(vis));
    	A[0] = 1;
    	dfs(1);
  	}	
  	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python异步编程小解一

Python异步编程 什么是异步&#xff0c;为什么是异步&#xff1f; 异步&#xff0c;意指你不用等到某个条件达成再去做某事&#xff0c;比如&#xff1a;你不用等到一切都准备好了才开始跳槽&#x1f415;.那么在 多线程 存在的情况下&#xff0c;我们为什么还要把目光投向 异…

Kafka - 3.x 文件存储不完全指北

文章目录 Topic数据的存储机制演示基本信息使用kafka-run-class.sh查看index内容使用kafka-run-class.sh查看log内容 index文件和log文件详解日志存储参数配置文件清理策略综述清理策略1&#xff09;delete策略2&#xff09;compact日志策略 高效读写的原因 Topic数据的存储机制…

Glide原理

本文基于Carson整理 1.简介 相比其他几种图片加载框架&#xff0c;Glide性能最好。这得益于其高效的图片缓存策略 其还有多样化的媒体格式加载&#xff1a;如GIF、Video&#xff0c;对于商城首页需展示丰富样式、信息的页面需求来说&#xff0c;也是必不可少的。 2.加载原理…

【数智化人物展】洞隐科技联合创始人兼CEO董志刚:数智化转型的核心是应用新技术打造新型的文化、组织和商业模式...

董志刚 本文由洞隐科技联合创始人兼CEO董志刚投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 数据智能产业创新服务媒体 ——聚焦数智 改变商业 在数字化日益渗透的今天&#xff0c;“释放数字价值&#xff0c;驱动智能转型”已逐渐成为企业转型与创新的关…

Vue插件的使用

一、插件的定义 &#xff08;一&#xff09;创建plugin.js文件 文件名可以自定义&#xff0c;但是行业内默认使用plugin作为文件名&#xff0c;该文件和main.js是平级的。 &#xff08;二&#xff09;编写对象中的install方法 install方法能够接收一个参数&#xff0c;就是…

【go】两数求和

文章目录 题目代码解法2 代码仓库 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案…

5款在线JavaScript加密混淆工具

5款常用、好用的在线JavaScript加密混淆工具&#xff0c;网址请从截图中查看。 1、jscrambler 2、JShaman 3、javascriptobfuscator 4、freejsobfuscator 5、jjencode

【PyQt】调整子控件的层级以调整绘制的先后顺序

简述 qt中貌似没有直接设置z序的函数&#xff0c;但对应的有其他调整z序的方法&#xff1a; QWidget.raise_()&#xff1a;置顶 QWidget.lower()&#xff1a;置底 QWidget.stackUnder(wid)&#xff1a;置于指定控件之下 其中关键函数是QWidget.stackUnder(wid)&#xff0c;利…

phpstorm2022.3.3和xdebug 3 调试代码记录

有鉴于之前使用log日志调试代码&#xff0c;或者var_dump()调试代码太慢了&#xff0c;系统出了问题排查效率低下。最终决定使用xdebug工具提高效率。总结如下&#xff1a; 1. xdebug版本要和phpstorm兼容&#xff0c; 这里使用xdeubug 3.1.6&#xff0c;phpstorm 2022.3.3 (破…

nvm的安装和使用

nvm用途 nvm是用来管理node版本的,安装成功之后可以去切换自己的node版本,就不需要通过安装卸载不同版本的node包 下载与安装 下载地址是https://github.com/coreybutler/nvm-windows/releases 下载nvm-setup.zip,然后安装就可以了 默认路径是C:\Users\wangjingtao\AppData\…

实现成绩发布的高效与便捷

老师们想不想告别繁琐的手动操作&#xff0c;简单省心的发布和查询考试成绩&#xff1f;今天分享的这个方法&#xff0c;可以让学生和家长自主查询成绩&#xff0c;是不是感觉超级方便呢&#xff1f;我来给各位老师讲解一下什么是成绩查询系统吧&#xff01; 成绩查询系统 成绩…

Reflect 对象的创建目的

目录 前言 逻辑 代码示例 使用 Reflect 操作属性 使用 Reflect 检查属性是否存在 使用 Reflect 创建代理 用法 结论 参考资料 前言 Reflect是JavaScript中的一个内置对象&#xff0c;它提供了一组用于访问对象属性和执行对象方法的方法。Reflect的设计目的是为了在语…

IDEA部署SSM项目mysql数据库MAVEN项目部署教程

如果 SSM 项目是基于 Maven 构建的&#xff0c;则需要配置 maven 环境&#xff0c;否则跳过这一步 步骤一&#xff1a;配置 Maven 第一步&#xff1a;用 IDEA 打开项目&#xff0c;准备配置 maven 环境 &#xff0c;当然如果本地没有提前配置好 maven&#xff0c;就用 IDEA 默…

多线程面试相关知识点

文章目录 (一) 进程线程和协程的区别创建线程的4种方式1. 继承Thread类2. 实现runnable接口3. 实现Callable接口4. 线程池创建 runnable 和 callable 有什么区别线程的 run()和 start()有什么区别&#xff1f;线程之间的状态变化notify()和 notifyAll()有什么区别&#xff1f;j…

C++之lambda匿名、using、typedef总【全】(二百四十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

如何选择最适合 Android 的 SD 卡恢复软件?

所需要的只是心不在焉地点击了错误的按钮、行为不当的应用程序、或者软件或硬件故障。就这样&#xff0c;您的照片消失了&#xff0c;您的笔记无处可寻&#xff0c;您的文件也消失了。 如何选择最适合 Android 的 SD 卡恢复软件 对别人最好的可能对你不起作用&#xff0c;这取…

【Unity小技巧】可靠的相机抖动及如何同时处理多个震动

每篇一句 围在城里的人想逃出来&#xff0c;站在城外的人想冲进去&#xff0c;婚姻也罢&#xff0c;事业也罢&#xff0c;人生的欲望大都如此。——钱钟书《围城》 前言 相机的抖动我相信大家都不陌生&#xff0c;网上其实已经有非常非常多的教程了&#xff0c;之前我也写过…

2.21每日一题(隐函数求导+变上限积分求导)

1、首先 t 0 时&#xff0c;x ? 或者 y ? 求出来 2、等式两边进行一阶求导&#xff0c;把一阶导函数&#xff08;隐函数求导&#xff09;求出来 3、等式两边再次求导&#xff0c;把二阶导函数&#xff08;隐函数求导&#xff09;求出来 注意&#xff1a;隐函数求导及变上…

Java 枚举类型与泛型-第13章

Java 枚举类型与泛型-第13章 1.枚举类型 枚举类型是一种特殊的数据类型&#xff0c;用于表示一组有限的命名常量。枚举类型可以帮助您更清晰地定义和管理相关常量&#xff0c;并提供类型安全性。 1.1使用枚举类型设置常量 枚举类型是一种非常方便的方式来设置常量。我们可以…

YUV空间-两张图片颜色匹配(颜色替换)

在做颜色匹配时&#xff0c;从RGB转换到YUV也有一些优势。因为YUV把亮度和色彩分开了&#xff0c;所以可以更容易地调整图像的亮度分布和色彩平衡⁴。而且&#xff0c;YUV也更接近人类感知颜色的方式&#xff0c;所以可以更好地保持图像的自然感。 这个公式是用来做颜色匹配的&…