nyist 488 素数环

素数环

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
 
描述

有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。

 
输入
有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。
输出
每组第一行输出对应的Case序号,从1开始。 如果存在满足题意叙述的素数环,从小到大输出。 否则输出No Answer。
样例输入
6
8
3
0
样例输出
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
Case 3:
No Answer







*****************************************************************************************************************************************
TimeLimitExceeded

#include <stdio.h>
#include<cstring>

int a[30],n,used[40];
int is_prime(int x)
{
   for(int i=2;i<x; i++)
      if(x%i==0) return 0;
     return 1;     
}

void dfs(int cur)
{
    int i;
    if(cur==n && is_prime(a[n]+a[1]))
    {
        for(i=1;i<n;i++)  printf("%d ",a[i]);
           printf("%d
",a[n]);
           return;
    } 
    
  for(i=2;i<=n;i++)
  {
      if(used[i]==0 && is_prime(a[cur]+i))
      {  a[cur+1]=i ; used[i]=1 ; dfs(cur+1);used[i]=0 ;}
  }     
}

 main( )
{   int c=1;
   
  while(scanf("%d",&n)!=EOF)
  {
      memset(used,0,sizeof(used)) ;
      a[1]=1;   used[1]=1;
      printf("Case %d:
",c++);

      dfs(1);
      //cout<<endl;
      if(n==1) printf("") ;

      else if(n%2) printf("No Answer
");

      else if(n==0)  break;
 
  }
    
    
}


















8888888888888888888888888888\





#include <iostream>
#include<cstring>
using namespace std;
int a[30],n,used[40];
int is_prime(int x)
{
   for(int i=2;i<x; i++)
      if(x%i==0) return 0;
     return 1;     
}

void dfs(int cur)
{
    int i;
    if(cur==n && is_prime(a[n]+a[1]))
    {
        for(i=1;i<n;i++)  cout<<a[i]<<" ";
           cout<<a[n]<<"
";
           return;
    } 
    
  for(i=2;i<=n;i++)
  {
      if(used[i]==0 && is_prime(a[cur]+i))
      {  a[cur+1]=i ; used[i]=1 ; dfs(cur+1);used[i]=0 ;}
  }     
}

 main( )
{   int c=1;
   
  while(cin>>n)
  {
      memset(used,0,sizeof(used)) ;
      a[1]=1;   used[1]=1;
      cout<<"Case "<<c++<<":"<<endl ;
      dfs(1);
      //cout<<endl;
      if(n==1) cout<<"" ;

      else if(n%2) cout<<"No Answer"<<endl;
      else if(n==0)  break;
 
  }
    
    
}
View Code







******************************************************************************************************************************************


#include <iostream>
#include <string.h>
using namespace std;
int a[30],used[30];
int n;

int is_prime( int x)
{
for (int i=2; i<x; i++)    if (x%i==0)  return 0;
return 1;
}

void dfs(int cur)
{    int i;
if (cur==n && is_prime ( a[1]+a[n] ))
{    
        for (i=1; i<n; i++ ) cout<<a[i]<<" ";
cout<<a[n]<<"
";
return ;    
}
for (i=2; i<=n;i++)
{    
if (  used[i]==0 &&  is_prime ( a[cur]+i ) )   
{    a[cur+1]=i ; used[i]=1;  dfs(cur+1);  used[i]=0; }
}
}

int main( )
{    int c=1;
while (cin>>n,n)
{    memset(used,0,sizeof(used));
a[1]=1;     used[1]=1;
cout<<"Case "<<c++<<":
";
if (n%2==0) dfs(1);
else if (n==1) cout<<"1
";
else cout<<"No Answer
";    
cout<<endl;
}
return 0;
}        
View Code

#include <iostream>

#include <string.h>

using namespace std;

int a[30],used[30];

int n;

int is_prime( int x)

{     for (int i=2; i<x; i++) 

                      if (x%i==0)  return 0;

                                        return 1;            }

void dfs(int cur)

{         int i;

            if (cur==n && is_prime ( a[1]+a[n] ))

                     {          for (i=1; i<n; i++ )         

                                       cout<<a[i]<<" ";                cout<<a[n]<<" ";                return ; 

                            }

              for (i=2; i<=n;i++)

         { 

               if (  used[i]==0 &&  is_prime ( a[cur]+i ) )  

                                    { a[cur+1]=i ; used[i]=1;  dfs(cur+1);  used[i]=0; }

         }

}

int main( )

{       

       int c=1;

             while (cin>>n,n)

       { 

                memset(used,0,sizeof(used));

                     a[1]=1;  used[1]=1;

                        cout<<"Case "<<c++<<": ";

               if (n%2==0)                    dfs(1);

                   else            if (n==1)                cout<<"1 ";

                                          else                          cout<<"No Answer "; 

                                                                    cout<<endl;

                }

              return 0;

}       

#include<stdio.h>
#include<stdlib.h>

int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};
int p[30],used[30],n;

int IsPrime(int num)
{
    int j;
    for (j=0;j<12;j++) if (num==prime[j]) return 1;
    return 0;
}

void DFS(int i)
{
    int j;
    if (i==n&&IsPrime(p[n]+p[1]))
    {
        for (j=1;j<n;j++) printf("%d ",p[j]);
        printf("%d
",p[j]);
        return;
    }
    for (j=2;j<=n;j++)
    {
        if ( used[j]==0 && IsPrime(p[i]+j) )
        {
            p[i+1]=j;
            used[j]=1;
            DFS(i+1);
            used[j]=0;
        }
    }
}

int main()
{
    int i=1,j;
    while (scanf("%d",&n) && n )
    {
        for (j=0;j<30;j++)  used[j]=0;
        printf("Case %d:
",i++);
        p[1]=1;
        if (n%2==0 || n==1) DFS(1);
        else  printf("No Answer
");
    }
    return 0;
}        
View Code

#include<stdio.h>

#include<stdlib.h>

int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};

int p[30],used[30],n;

int IsPrime(int num)

           {    

                             int j;   

           for (j=0;j<12;j++)

                    if (num==prime[j])              return 1;   

                                    return 0;              

               }

void DFS(int i)

{   

  int j;

    if (i==n&&IsPrime(p[n]+p[1]))

    {  

       for (j=1;j<n;j++) printf("%d ",p[j]);

        printf("%d ",p[j]);

        return;  

                       }

            for (j=2;j<=n;j++)

   

              {         if ( used[j]==0 && IsPrime(p[i]+j) )

                                               {             p[i+1]=j;             used[j]=1;             DFS(i+1);             used[j]=0;         }

                }

  }

int main()

{   

  int i=1,j;

    while (scanf("%d",&n) && n )

    {

        for (j=0;j<30;j++)         used[j]=0;

        printf("Case %d: ",i++);         p[1]=1;

                     if (n%2==0 || n==1)            DFS(1);

                                else                       printf("No Answer ");

    }

    return 0;

}       












原文地址:https://www.cnblogs.com/2014acm/p/3891144.html