链接:点击打开链接
题意:给出一个n,用1~n围成一个环要求相邻的两个数和是素数,输出所有可能(以数字1为头)
代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
int prime[1005],num[1005],temp[1005],vis[1005];
int n;
void dfs(int cur){
int i;
if(cur==n&&!prime[1+temp[n-1]]){ //个数到n并且收尾和也是素数输出
for(i=0;i<n;i++){
if(i!=n-1)
printf("%d ",temp[i]);
else
printf("%d\n",temp[i]);
}
}
for(i=2;i<=n;i++){
if(!vis[i]&&!prime[i+temp[cur-1]]){
temp[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
}
int main(){
int i,j,k,cur;
k=0;cur=1;
memset(prime,0,sizeof(prime));
for(i=2;i<1000;i++){
if(!prime[i])
num[k++]=i;
for(j=0;j<k&&num[j]*i<1000;j++){
prime[num[j]*i]=1;
if(i%num[j]==0)
break;
}
} //素数筛
while(scanf("%d",&n)!=EOF){
printf("Case %d:\n",cur++);
temp[0]=1; //第一位必须是1
memset(vis,0,sizeof(vis));
dfs(1);
cout<<endl;
}
return 0;
}