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.
Note: the number of first circle should always be 1.

Note: the number of first circle should always be 1.

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.
You are to write a program that completes above process.
Print a blank line after each case.
You are to write a program that completes above process.
Print a blank line after each case.
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<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<map>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;
int n;
int isprime(int n){
if(n==2||n==3||n==5||n==7||n==11||n==13||n==17||n==19||n==23||n==29||n==31||n==37)
return 1;
return 0;
}
int vis[22];
int s[22];
void dfs(int p){ //第p层
if(p==n){
if(isprime(s[0]+s[n-1])){
for(int i=0;i<n-1;++i)
printf("%d ",s[i]);
printf("%d\n",s[n-1]);
}
return;
}
for(int i=2;i<=n;++i){
if(isprime(i+s[p-1])&&vis[i]==0){
s[p]=i;
vis[i]=1;
dfs(p+1);
vis[i]=0;
}
}
}
int main(){
int cnt=0;
while(cin>>n){ //想不通为什么这里用scanf就错。。。
memset(vis,0,sizeof(vis));
printf("Case %d:\n",++cnt);
s[0]=1;
dfs(1);
printf("\n");
}
return 0;
}
原本超时代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<map>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;
int n;
int isprime(int n){
if(n==2||n==3||n==5||n==7||n==11||n==13||n==17||n==19||n==23||n==31||n==37)
return 1;
return 0;
}
int v[22];
int s[22];
void dfs(int p,int q){
s[q]=p;
if(q==n-1){
if(!isprime(s[0]+s[n-1]))
return;
for(int i=0;i<n-1;++i){
printf("%d ",s[i]);
}
printf("%d\n",s[n-1]);
return;
}
for(int i=1;i<=n;++i){
if(v[i]==0&&isprime(p+i)){
v[i]=1;
dfs(i,q+1);
v[i]=0;
}
}
}
int main(){
int cnt=0;
while(scanf("%d",&n)&&n!=EOF){
memset(v,0,sizeof(v));
v[1]=1;
printf("Case %d:\n",++cnt);
dfs(1,0);
printf("\n");
}
return 0;
}