描述
素数环是用一串数字组成一个环,在这个环中任意两个相邻的数字的和都是素数。
现要求输入一个数字n(1~20),将1到n这n个数字组成一个素数环。
求输入n时,求能够组成素数环的方案以及方案总数。(存在多个素数环的方案,按照字典序输出)
输入
输入一个正整数n。
输出
首先输出每种方案的具体数据,如果有多种方案按照字典序输出对应的结果。最后一行输出方案总数。
注意:输出时,每行的末尾没有多余的空格
输入样例 1
8
输出样例 1
1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 4
提示
第1个数必选 1,从第 2个数开始启动查找。
思路:从1开始深搜。①查找1后面可以放的数字(在2~n中寻找),如果有个数字没有被访问过并且相加的和是质数,那么就放这个数,这个数要标记已访问。继续去找这个数后面可以放什么数。以此类推。
②深搜结束后,要将访问标志清空,在循环到后面数,看还有没有可以放的,继续深搜。
代码:
#include<iostream>
using namespace std;
int prime[40],a[40],visit[40];
int n,cnt=0;
void ispri(int n){
for(int i=2;i<=n;i++){
if(prime[i]==0){
for(int j=i*i;j<=n;j+=i){
prime[j]=1;
}
}
}
}
int dfs(int step){
if(step==n){
if(prime[a[n]+a[1]]==0){
for(int i=1;i<n;i++){
cout<<a[i]<<' ';
}
cout<<a[n];//每行不加空格
cnt++;
cout<<endl;
}
return cnt;
}
for(int i=2;i<=n;i++){
if(visit[i]==0 && prime[a[step]+i]==0){
a[step+1]=i;
visit[i]=1;
dfs(step+1);
visit[i]=0;
}
}
}
int main(){
cin>>n;
ispri(n+n);
a[1]=1;
dfs(1);
cout<<cnt;
return 0;
}