老早以前就遇到的一道题,那时候傻傻地用next_permutation()……dfs+剪枝
#include<bits/stdc++.h> using namespace std; const int prime[38]= {0,0,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}; int vis[20],n,curr,p[20]; void dfs(int curr) { if(curr==n&&prime[1+p[n-1]]) { printf("1"); for(int i=1;i<n;i++) printf(" %d",p[i]); printf("\n"); } for(int i=2;i<=n;i++) { if(!vis[i]&&prime[i+p[curr-1]]) { p[curr]=i; vis[i]=1; dfs(curr+1); vis[i]=0; } } } int main() { int kcase=0; while(scanf("%d",&n)==1) { printf("Case %d:\n",++kcase); memset(vis,0,sizeof(vis)); p[0]=1; dfs(1); printf("\n"); } return 0; }