题目大意:给定一个数判断是否有环可以构成每个相邻的数的和是一个素数.
思路:从1开始DFS,遇到相加全成为素数环的就输出,类似的回溯,递归,数列1-n都是奇偶相间的,所以当N为奇数时,一定有种奇+奇的方式,所以不可能会有素数.那么可以剪枝.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#define ll __int64
#define inf 0x3f3f3f3f
using namespace std;
int arr[100000],n;bool vis[10000];
bool prim(int p)
{
for(int i=2;i*i<=p;i++)
if(p%i==0)
return false;
return true;
}
void DFS(int tmp)
{
if((n-1==tmp)&&prim(arr[n-1]+1))
{
for(int i=0;i<n;i++)
printf(i==0?"%d":" %d",arr[i]);
printf("\n");
}
else
{
for(int i=2;i<=n;i++)
if(!vis[i]&&prim(arr[tmp]+i))
{
vis[i]=true;
arr[tmp+1]=i;
DFS(tmp+1);
vis[i]=false;
}
}
}
int main()
{
int m,i,j,k,cla=1;
while(~scanf("%d",&n)&&n)
{
printf("Case %d:\n",cla++);
if(n==1) {printf("1\n");continue;}
if(n&1){printf("No Answer\n");continue;}
memset(vis,false,sizeof(vis));
vis[1]=true;arr[0]=1;
DFS(0);
}
return 0;
}