NOJ——[1361] Prime Again

  • 问题描述
  • 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
素数环,dfs回溯解决,特判n==1。

#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;
}


你可能感兴趣的:(NOJ——[1361] Prime Again)