题目链接:传送门
分析:素数环,打印素数,然后用DFS遍历每种可能的相加情况就OK了
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[30],n;
bool vis[250];
int prime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};
void dfs(int num){
if(num==n&&prime[a[num-1]+a[0]]){
for(int i=0;i<num;i++)
if(i==num-1) cout<<a[i]<<endl;
else cout<<a[i]<<" ";
}
else{
for(int i=2;i<=n;i++){
if(!vis[i]&&prime[i+a[num-1]]){
vis[i]=true;
a[num]=i;
dfs(num+1);
vis[i]=false;
}
}
}
}
int main(){
int time=1;
while(cin>>n){
memset(vis,false,sizeof(vis));
a[0]=1;
cout<<"Case "<<time<<":"<<endl;
dfs(1);
cout<<endl;
time++;
}
}