Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Input n (0 < n < 20).
Output The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
Sample Input 6 8
Sample Output Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 |
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int a[20],v[20],n;
int prime(int x) { //进行素数判断。
if(x<2)return 0;
else {
for(int i=2; i*i<=x; i++)
if(x%i==0)return 0;
return 1;
}
}
void dfs(int s) {
if(s==n&&prime(a[1]+a[n])) { //首尾不要忘记
for(int i=1; i<n; i++)
cout<<a[i]<<" ";
cout<<a[n]<<endl;
} else {
for(int i=2; i<=n; i++) { //这里得for循环有两个主要的用处
//1、记录整个循环过程中符合的数列
//2、用于生成满足数列得下一位
if(!v[i]&&prime(a[s]+i)) {
a[s+1]=i; //验证下一个数符合不符合;
v[i]=1; //用完进行标记
dfs(s+1); //寻找下一个
v[i]=0; //清除标记
}
}
}
}
int main() {
int d=0;
while(cin>>n) { //hdoj,scanf会超时;
memset(v,0,sizeof(v));
a[1]=1;
d++;
printf("Case %d:\n",d); //注意输出格式;
dfs(1);
printf("\n");
}
}
|