点击打开链接
//递归枚举+二分
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=20+5;
const int a[]={2,3,5,7,11,13,17,19,23,29,31,37};
bool done[maxn];
int f[maxn];
int n;
bool isp(int k)
{
if(*lower_bound(a,a+12,k)==k) return true;
return false;
}
void dfs(int x) //x指向要填入的位置
{
if(x==n&&isp(f[0]+f[n-1])) { //顺时针 逆时针均为素数环
for(int i=0;i<n-1;i++)
printf("%d ",f[i]);
printf("%d\n",f[n-1]);
}
else {
for(int i=2;i<=n;i++)
{
if(!done[i]&&isp(i+f[x-1])) {
done[i]=true;
f[x]=i; //填入数组
dfs(x+1); //指向下一个填数位置
done[i]=false; //消除标志
}
}
}
}
int main()
{
int kase=0;
while(scanf("%d",&n)==1)
{
if(kase) printf("\n");
memset(done,false,sizeof(done));
printf("Case %d:\n",++kase);
f[0]=1;
dfs(1);
}
return 0;
}
uva 524 dfs回溯+二分
最新推荐文章于 2025-09-07 17:54:15 发布
