简单的dfs,貌似这道题用暴力枚举就可以了,毕竟数据开的是比较小的。
#include"iostream" #include"algorithm" #include"stdio.h" #include"string.h" #include"string" #include"vector" #include"cmath" #define mx 105 using namespace std; int q[mx],rear; bool vis[mx]; int n; bool prime(int x) { int i; if(x==2) return true; for(i=3;i<=x/2;i+=2) { if(x%i==0) break; } if(i<=x/2) return false; return true; } void dfs(int x) { int i; if(rear==n-1) { if(prime(1+x)) { cout<<q[0]; for(i=1;i<n;i++) cout<<' '<<q[i]; cout<<endl; return; } else return; } for(i=2;i<=n;i++) { if(!vis[i]&&(i+x)%2==1&&prime(i+x)) { vis[i]=true; q[++rear]=i; dfs(i); --rear; vis[i]=false; } } } int main() { int icase=0; while(scanf("%d",&n)==1) { memset(vis,false,sizeof(vis)); icase++; rear=0; q[0]=1; vis[1]=true; cout<<"Case "<<icase<<":"<<endl; dfs(1); cout<<endl; } return 0; }