- 问题描述
- We all vary familar with prime numbers, now we get a integer N(1<=n <= 16), for 1 to N, your task is to write a
Cyclic sequences a1~an, all numbers only use once, and every sum of adjacent two numbers should be prime. No matter how you cut a circle, they're just the same, so one circle should be print only once. For all results, we print by lexicographical order. If there's no answer, you needn't print anything. - 输入
- There are many cases, end until EOF, each a integer N(1<=n <= 16) in a single line.
- 输出
- Please prnit by lexicographical order.
- 样例输入
4 6
- 样例输出
1 2 3 4 1 4 3 2 1 4 3 2 5 6 1 6 5 2 3 4
- 提示
无
- 来源
Minary
#include<stdio.h>
#include<string.h>
bool prime[100];
int ans[20],n;
bool vis[100];
void dfs(int cur)
{
if(cur == n && prime[ans[0]+ans[n-1]])
{
for(int i=0;i<n;i++)
{
printf("%d",ans[i]);
if(i<n-1)
printf(" ");
}
printf("\n");
return ;
}
for(int i=2;i<=n;i++)
{
if(!vis[i] && prime[ans[cur-1]+i])
{
vis[i]=1;
ans[cur]=i;
dfs(cur+1);
vis[i]=0;
}
}
}
int main()
{
memset(prime,0,sizeof(prime));
prime[2]=1;
prime[3]=1;
prime[5]=1;
prime[7]=1;
prime[11]=1;
prime[13]=1;
prime[17]=1;
prime[19]=1;
prime[23]=1;
prime[29]=1;
prime[31]=1;
while(~scanf("%d",&n))
{
memset(vis,0,sizeof(vis));
if(n>1)
for(int i=1;i<=n;i++)
{
vis[i]=1;
ans[0]=i;
dfs(1);
}
}
return 0;
}