当前位置: 首页 > news >正文

蓝桥杯备赛 Day14 素数环

信息学奥赛一本通(C++版)在线评测系统

【题目描述】

输入正整数nn,把整数11,22,…,nn 组成一个环,使得相邻两个整数之和均为素数。

【输入】

输入正整数nn。

【输出】

输出任意一个满足条件的环。

【输入样例】

6

【输出样例】

4 3 2 5 6 1

【提示】

数据满足:

4≤n≤30

#include<iostream>
#include<cmath>
using namespace std;

int n;
bool vis[110];
int cnt[110];
bool flag = false;//先假装搜不到


bool isPrime(int x) {
	if (x < 2) return false;
	for (int i = 2; i <= sqrt(x); i++) {
		if (x % i == 0) return false;
	} return true;
}

void dfs(int depth) {
	//7.终止条件
	if (depth > n) {//前n层已经搜完了
		if (!isPrime(cnt[depth - 1] + cnt[1])) return;
		for (int i = 1; i < depth; i++) {
			cout << cnt[i] << " ";
		}cout << endl;
		flag = true;
		return;
	}

	//1.枚举方案
	for (int i = 1; i <= n; i++) {
		//	2.判断标记
		if ((depth == 1 && !vis[i]) || (depth > 1 && !vis[i] && isPrime(i + cnt[depth - 1]))) {
			//	3.搜索
			cnt[depth] = i;
			//	4.标记 - 防止重复搜索
			vis[i] = 1;
			//	5.进入下一层搜索
			dfs(depth + 1);
			//	6.回溯
			vis[i] = 0;
			if (flag == true) return;
		}
	}
}

int main() {

	cin >> n;
	dfs(1);
	return 0;
}

优化

#include<iostream>
#include<cmath>
using namespace std;

int n;
bool vis[110];
int cnt[110];
bool flag = false;//先假装搜不到

//bool isPrime(int x) {
//	if (x < 2) return false;
//	for (int i = 2; i <= sqrt(x); i++) {
//		if (x % i == 0) return false;
//	} return true;
//}

bool isPrime[110];//标记素数   isPrime[x]=0/1   0-x是素数  1-x不是素数
//埃氏筛原理:将素数的倍数全部筛掉,留下的就是素数
void E_sieve(int n) {

	isPrime[0] = isPrime[1] = 1;//0和1不是素数
	for (int i = 2; i * i <= n; i++) {
		if (isPrime[i] == 0) {//代表i是素数
			for (int j = i * i; j <= n; j += i) {//j代表i的所有倍数(n以内)
				isPrime[j] = 1;//j一定不是素数
			}
		}
	}
}

void dfs(int depth) {
	//7.终止条件
	if (depth > n) {//前n层已经搜完了
		if (isPrime[cnt[depth - 1] + cnt[1]]) return;
		for (int i = 1; i < depth; i++) {
			printf("%d ", cnt[i]);
		}cout << endl;
		flag = true;
		return;
	}

	//1.枚举方案
	for (int i = 1; i <= n; i++) {
		//	2.判断标记
		if ((depth == 1 && !vis[i]) || (depth > 1 && !vis[i] && !isPrime[i + cnt[depth - 1]])) {
			//	3.搜索
			cnt[depth] = i;
			//	4.标记 - 防止重复搜索
			vis[i] = 1;
			//	5.进入下一层搜索
			dfs(depth + 1);
			//	6.回溯
			vis[i] = 0;
			if (flag == true) return;
		}
	}
}

int main() {

	cin >> n;
	E_sieve(2*n);//最大要筛n+n-1,
	
	dfs(1);
	return 0;
}

相关文章:

  • 【C++学习篇】C++11
  • AlmaLinux9.5安装samba实现与Windows文件共享 笔记250214
  • Spring Boot 常用依赖详解:如何选择和使用常用依赖
  • 20250213刷机飞凌的OK3588-C_Linux5.10.209+Qt5.15.10_用户资料_R1
  • Box Loss:目标检测中精准框定的秘密武器
  • 自动化测试基本流程
  • RabbitMQ解耦订单模块
  • 在 Android 中实现 H5 文件下载功能:跨版本文件存储机制解析
  • 使用数据库sqlite 筛选人脸信息
  • Tomcat添加到Windows系统服务中,服务名称带空格
  • FreeRTOS低功耗总结
  • 【进阶】JVM篇
  • Kernel之Tcpdump和Netfilter
  • CVE-2022-41352 漏洞分析与利用
  • 基于SpringBoot的在线交通服务管理系统
  • 持有无人机飞手执照,会组装调试维修入伍参军技术详解
  • 104、二叉树的最大深度
  • 同步buck型降压DCDC芯片外围电路详解
  • 一款利器提升 StarRocks 表结构设计效率
  • 图片旋转方向分类:从零开始构建深度学习模型
  • 体坛联播|郑钦文收获红土赛季首胜,国际乒联公布财报
  • 总粉丝破亿!当网络大V遇见硬核科技,互联网时代如何书写上海故事?
  • 马上评|让“贾宝玉是长子长孙”争议回归理性讨论
  • 上海楼市“银四”兑现:新房市场高端改善领跑,二手房量价企稳回升
  • 国家主席习近平同普京总统举行小范围会谈
  • 印巴局势快速升级,外交部:呼吁印巴以和平稳定的大局为重