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

信息学奥赛一本通 2110:【例5.1】素数环

【题目链接】

ybt 2110:【例5.1】素数环

【题目考点】

1. 深搜回溯
2. 质数

【解题思路】

1~n的数字构成一个环,要求相邻数字加和必须是质数。
该题最终输出的是一个序列,只不过逻辑上序列最后一个数字的下一个数字就是序列的第一个数字。数值1一定在这个序列中,因此我们让序列第1个数字就是数值1。
而后使用深搜算法依次确定第2个数字,第3个数字。。。
在确定第k个数字时,首先该数字只能是1~n中的数字,其次该数字必须没有使用过,而且该数字和前一个数字(第k-1个数字)的加和必须是质数。将可能的满足以上条件的数字作为序列的第k个数字。
当k为n+1,也就是满足k>n时,已经确定了序列中的n个数字,此时如果第1个数字和第n个数字的加和也是质数,那么就确定了一个满足条件的质数环,将序列中的数字输出。
可以使用标志位isOver记录是否已经找到解。如果已经找到解,那么递归调用可以直接返回,不用继续进行搜索。

【题解代码】

解法1:深搜回溯
#include <bits/stdc++.h>
using namespace std;
#define N 35
int n, a[N];
bool vis[N], isOver;
bool isPrime(int x)//判断x是否是质数
{
	if(x < 2)
		return false;
	for(int i = 2; i*i <= x; ++i) if(x%i == 0)
		return false;
	return true;
}
void dfs(int k)
{
	if(isOver)
		return;
	if(k > n)
	{
		if(isPrime(a[n]+a[1]))
		{
			isOver = true;
			for(int i = 1; i <= n; ++i)
				cout << a[i] << ' ';
			cout << endl;
		}
		return;
	}
	for(int i = 1; i <= n; ++i)  if(!vis[i] && isPrime(a[k-1]+i))
	{
		vis[i] = true;
		a[k] = i;//选择数值i作为第k个数字
		dfs(k+1);
		vis[i] = false;
	}
}
int main()
{
	cin >> n;
	a[1] = 1;
	vis[1] = true;
	dfs(2);
	return 0;
}

http://www.kler.cn/a/522003.html

相关文章:

  • MV结构下设置Qt表格的代理
  • postgres基准测试工具pgbench如何使用自定义的表结构和自定义sql
  • 数据分析系列--③RapidMiner算子说明及数据预处理
  • 数据结构题目 课时9
  • Java 9模块开发:IntelliJ IDEA实战指南
  • Java远程关闭Appium服务
  • 2025数学建模美赛|A题成品论文
  • 神经网络|(六)概率论基础知识-全概率公式
  • 爱快 IK-X9 吸顶AP 简单开箱评测和拆解,三频WiFi7,BE5000,2.5G网口
  • Continuous Batching 连续批处理
  • 基于ESP8266的多功能环境监测与反馈系统开发指南
  • 嵌入式C语言:结构体
  • KF-GINS 和 OB-GINS 的 Earth类 和 Rotation 类
  • 安卓日常问题杂谈(一)
  • Java-数据结构-二叉树习题(3)
  • 落地 基于特征的对象检测
  • leetcode 面试经典 150 题:简化路径
  • 鲁滨逊漂流记读后感
  • 【PySide6快速入门】QGridLayout 网格布局
  • 如何使用 DeepSeek API 结合 VSCode 提升开发效率
  • 深度学习笔记13-CIFAR彩色图片识别(Pytorch)
  • 供应链管理中的BOM 和 MRP 是什么,如何计算
  • 探索前端可观察性:如何使用Telemetry提高用户体验
  • 基于Java+Springboot+MySQL校园在线考试网站系统设计与实现
  • zyNo.19
  • 解析“in the wild”——编程和生活中的俚语妙用