题目描述 Description
一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数。如下图是一个大小为6的质数环。为了方便描述,规定数环上的第一个数字总是1。如下图可用1 4 3 2 5 6来描述。若两个质数环,数字排列顺序相同则视为本质相同。现在要求你求出所有本质不同的数环。
输入描述 Input Description
只有一个数N,表示需求的质数环的大小。如:
输出描述 Output Description
每一行描述一个数环,如果有多组解,按照字典序从小到大输出。如:
样例输入 Sample Input
6
样例输出 Sample Output
1 4 3 2 5 6
1 6 5 2 3 4
数据范围及提示 Data Size & Hint
n<=17
分类标签 Tags 点此展开
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int a[10001]={0,1}; 5 int vis[1001]; 6 int n; 7 bool pd(int x,int y) 8 { 9 int k=2,i=x+y; 10 while (k<=sqrt(i)&&i%k!=0) k++; 11 if (k>sqrt(i)) return 1; 12 else return 0; 13 } 14 void printf() 15 { 16 for(int i=1;i<=n;i++) 17 cout<<a[i]<<" "; 18 cout<<endl; 19 } 20 void f(int k)// now表示现在剩余的值 21 { 22 if(k==n+1&&pd(a[n],a[1])) 23 { 24 printf(); 25 return; 26 } 27 else 28 { 29 for(int i=2;i<=n;i++) 30 { 31 if(vis[i]==0&&pd(a[k-1],i)) 32 { 33 vis[i]=1; 34 a[k]=i; 35 f(k+1); 36 vis[i]=0; 37 a[k]=0; 38 } 39 } 40 } 41 } 42 int main() 43 { 44 45 cin>>n; 46 vis[1]=1; 47 f(2); 48 return 0; 49 }
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int a[10001]={0,1}; 5 int vis[1001]; 6 int n; 7 bool pd(int x,int y) 8 { 9 int k=2,i=x+y; 10 while (k<=sqrt(i)&&i%k!=0) k++; 11 if (k>sqrt(i)) return 1; 12 else return 0; 13 } 14 void printf() 15 { 16 for(int i=1;i<=n;i++) 17 cout<<a[i]<<" "; 18 cout<<endl; 19 } 20 void f(int k)// now表示现在剩余的值 21 { 22 if(k==n+1&&pd(a[n],a[1])) 23 { 24 printf(); 25 return; 26 } 27 else 28 { 29 for(int i=2;i<=n;i++) 30 { 31 if(vis[i]==0&&pd(a[k-1],i)) 32 { 33 vis[i]=1; 34 a[k]=i; 35 f(k+1); 36 vis[i]=0; 37 a[k]=0; 38 } 39 } 40 } 41 } 42 int main() 43 { 44 45 cin>>n; 46 vis[1]=1; 47 f(2); 48 return 0; 49 }