题目描述
输入正整数 n,把整数 1,2,…,n 组成一个环,使得相邻两个整数之和均为素数。
注意:环的第一个数字始终是 1
输入格式
输入多组数据,每组一个正整数 n ,读到 EOF
结束 (n≤16)
输出格式
输出时,从整数 1 开始逆时针排列。同一个环恰好输出一次。保证一定有解。
第 i 组数据输出前加上一行 Case i
:
相邻两组数据中间加上一个空行。
(参照样例)
输入输出样例
输入 #1
6 8
输出 #1
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<bits/stdc++.h>
using namespace std;
int n;
int ans[20];
bool v[20];
bool is_prime(int x){
if(x==1) return false;
for(int i=2;i<x;i++){
if(x%i==0) return false;
}
return true;
}
void dfs(int cur){
if(cur==n+1){
if(is_prime(ans[1]+ans[n])==0) return;
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}else{
for(int i=1;i<=n;i++){
if(v[i]==0 && is_prime(ans[cur-1]+i)){
ans[cur]=i;
v[i]=1;
dfs(cur+1);
v[i]=0;
}
}
}
}
int main() {
ans[1]=1;
v[1]=1;
int k=0;
while(cin>>n){
k++;
cout<<"Case "<<k<<":"<<endl;
dfs(2);
cout<<endl;
}
return 0;
}