试题描述
|
输入正整数n,用整数1,2,3,……,n 的某种排列组成一个环,使任意相邻的两数和均为素数。你的任务是输出有多少种排列方案。
|
输入
|
一个正整数n。
|
输出
|
一个数,代表有多少种方案。
|
输入示例
|
6
|
输出示例
|
2
|
其他说明
|
n〈=16
|
用搜索。
1 #include <iostream> 2 3 using namespace std; 4 int A[21],vis[21],n,t; //A数组储存的是符合的素数环,vis判断当前数字是否访问过(visit) 5 6 bool is_prime(int n) //判断素数标准模板 7 { 8 for(int i=2;i*i<=n;i++) if(n%i==0) return false; 9 return true; 10 } 11 12 void js(int x) 13 { 14 if(x==n && is_prime(A[0]+A[n-1])) t++; 15 for(int i=2;i<=n;i++) //从2开始一个个判断 16 { 17 if(vis[i]==0 && is_prime(i+A[x-1])) //如果没有被用过且与其相邻数的和是素数 18 { 19 A[x]=i; 20 vis[i]=1; 21 js(x+1); //开始找下一个方案 22 vis[i]=0; //在下一个方案中,这个位置并没有访问过,所以一定要标记回0 23 } 24 } 25 } 26 27 int main() 28 { 29 scanf("%d",&n); 30 A[0]=1; 31 vis[1]=1; 32 js(1); 33 printf("%d",t); 34 //system("pause"); 35 return 0; 36 }