#include <bits/stdc++.h>
using namespace std;
int n, tot;
int a[17];
bool vis[17];
//判断x是否为质数
bool check(int x)
{
if(x<2){
return false;
}
for(int i=2; i<=sqrt(x); ++i){
if(x%i==0){
return false;
}
}
return true;
}
//当前安排的是第几个位置
void dfs(int cnt)
{
//已经安排完n个位置了
if(cnt==n+1){
for(int i=1; i<=n; ++i){
printf("%d ", a[i]);
}
printf("\n");
}
else{ //还没安排完n个位置, 则安排第cnt个位置
//对于第cnt个位置, 枚举可能的数字
for(int i=2; i<=n; ++i){
//如果i这个数字没被使用过, 而且i和前面安排的数字a[cnt-1]之和是质数
if(!vis[i] && check(i+a[cnt-1])){
//如果准备安排的位置是第n个位置, 还需要和第一个位置求和验证
if(cnt==n && check(i+1)){
a[cnt]=i; //满足条件, 安排
vis[i]=true; //打标记, 防止后面的位置再用到i这个数
dfs(cnt+1);
vis[i]=false; //回溯
}
else if(cnt<n){ //如果不是第n个位置, 则只需要和前面的数字求和验证
a[cnt]=i;
vis[i]=true;
dfs(cnt+1);
vis[i]=false; //回溯
}
}
}
}
}
int main()
{
while(scanf("%d", &n)!=EOF){
tot++;
printf("Case %d:\n", tot);
//由于按从小到大顺序排列, 所以第一个始终为1
a[1]=1;
vis[1]=true;
dfs(2);
printf("\n");
}
return 0;
}
素数环——深搜、回溯
最新推荐文章于 2022-04-24 21:30:43 发布