素数环
简单dfs,深搜就好。
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int sp[50]; // 是否是素数
int vis[20]; // 表示这个数字是否被访问过
int ans[20];// 存答案的
int n;
bool isprime(int n){
for(int i = 2;i < n;i++){
if(n % i == 0)
return false;
}
return true;
}
void dfs(int p,int m){
if(p == n){
if(sp[m+1]){
printf("1");
for(int i = 0;i < n-2;i++){
printf(" %d",ans[i]);
}
printf(" %d\n",m);
return;
}
}
else{
ans[p-2] = m;
vis[m] = 1;
for(int i = 2;i <= n;i++){
if(!vis[i] && sp[i+m])
dfs(p+1,i);
}
vis[m] = 0;
}
}
int main(){
vis[1] = 1; // has been used
for(int i = 2;i <= 40;i++){
if(isprime(i))
sp[i] = 1;
}
int cnt = 0;
while(scanf("%d",&n) != EOF){
cnt++;
memset(vis,0,sizeof(vis));
printf("Case %d:\n",cnt);
for(int i = 2;i <= n;i++){
if(sp[i+1]){
dfs(2,i);
}
}
puts("");
}
return 0;
}