素数环2
题目描述
将1~n这n个数字首尾相连,形成一个圆环,要求圆环上任意两个相邻的数字之和都是一个素数,请编程输出符合条件的素数环。
输入
输入数据仅一行,包含一个正整数n(n<=20)。
输出
输出数据最多包括10行,每行由n个整数组成,表示前十个符合条件的素数环(不足十个时全部输出)。所有素数环第一个元素必须是1,且按照从小到大的顺序排列。
输入复制
6
输出复制
1 4 3 2 5 6
1 6 5 2 3 4
AC代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int n, cur, q[N], st[N], isp[N];
void print()
{
++ cur;
for (int i = 1; i <= n; ++ i)
cout << q[i] << ' ';
cout << endl;
}
bool check(int k)
{
for (int i = 2; i <= sqrt(k); ++ i)
if (k % i == 0) return false;
return true;
}
void dfs(int k)
{
int i;
if (cur >= 10) return;
if (k <= n) {
if (k & 1) i = 3;
else i = 2;
for (; i <= n; i += 2) {
if (!st[i]) {
st[i] = 1;
q[k] = i;
if (isp[q[k - 1] + q[k]])dfs(k + 1);
st[i] = 0;
}
}
} else if (isp[1 + q[k - 1]]) print();
}
int main()
{
cin >> n;
if (n & 1) return 0;
for (int i = 2; i <= 2 * n; ++ i) isp[i] = check(i);
q[1] = 1;
dfs(2);
return 0;
}
题解
采用递归回溯的方法,进行每次存储,需要注意的是,连接成一个环,一定不要忘了第一个元素和最后一个元素也要满足和为素数
优化点
- 如果n为奇数,那么肯定不能形成一个素数环。
- 满足素数环的条件,必须相邻的两个数既不能都是奇数,也不能都是偶数,由题目知,奇数放奇数,偶数放偶数,在递归中采用步长为2,就是依据此原理
- 筛素数,在判断前,对数据提前存储素数,有利于快速判断素数,是以空间换时间的思想