将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。
n=20时,下面的序列就是一个素数环:
1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 20 11 12 19 18
dfs即可。。
#include<cstdio>
using namespace std;
int a[1001] = {
}, n;
bool judge[1001] = {
},flag = 0;
bool sushu(int x){
。 //先写一个函数判断是否是素数(这个写的比较虎,定义法判断的,没用筛法)
int k = 0;
for(int i = 1;i <= x; i++){
if(x % i == 0) k++;
}
if(k <= 2) return true;
else return false;
}
void dfs(int x){
if(x > n){
for(int i = 1;i <= n; i++){
printf("%d " ,a[i]);
}
flag = 1;
return;
}
for(int i = 1;i <= n; i++){
if(flag) return;
if(x == 20){
if(judge[i] == 0 && sushu(a[1] + i) && sushu(a[x - 1] + i)){
//特判最后一个,因为这个要和第一个连起来
judge[i] = 1;
a[x] = i;
dfs(x + 1);
return;
}
}
else if(judge[i] == 0 && sushu(a[x - 1] + i)){
//其余的判断是否是素数
judge[i] = 1;
a[x] = i;
dfs(x + 1);
judge[i] = 0;
}
}
}
int main()
{
n = 20;
dfs(1);
return 0;
}