素数环
题目:
给定1到n的数字中,将数字依次填入环中,使得任意相邻的数字之和为素数。
要求第一个数为1,输入的数n为1<n<17
#include<stdio.h>
using namespace std;
int ans[22]; //保存环中的每一个被放入的数
bool hash[22];
int n;
//判断一个数是否为素数,输入不大于16,故两数之和必在该数组内
int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41};
bool judge(int x){
for(int i=0;i<13;i++){
if(prime[i]==x) return true;//在数组中查找若查找成功则该数为素数
}
return false; //否则不是素数
}
void check(){
if(judge(ans[n]+ans[1])==false) return;//判断最后一个数和第一个数的和是否为素数
for(int i=1;i<=n;i++){ //输出解,注意最后一个数字后没有空格
if(i!=1) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
void DFS(int num){ //递归枚举,num为当前已经放入环中的数字
if(num>1)
if(judge(ans[num]+ans[num-1])==false) return;
if(num==n){
check();
return;
}
for(int i=2;i<=n;i++){
if(hash[i]==false){ //若i还没有被放入环中
hash[i]=true;
ans[num+1]=i;
DFS(num+1); //尝试放入下一个数
hash[i]=false;
}
}
}
int main(){
int cas=0; //记录case数
while(scanf("%d",&n)!=EOF){
cas++;
for(int i=0;i<22;i++)
hash[i]=false; //初始化
ans[1]=1;
printf("case %d:\n",cas); //输出case数
hash[1]=true;
DFS(1);
printf("\n");
}
return 0;
}