HDOJ 1016

素数环,DFS能算到14就差不多了。。
#include <iostream>
#include <cmath>

using namespace std;

int is_prime(int n)
{
    int ok=1;
    if(n==1||n==0) return 0;
    if(n==2)  return 1;
    int m=sqrt(n)+1;
    for(int i=2;i<=m;i++)
    {
        if(n%i==0)
        {
            ok=0;
            break;
        }
    }
    if(ok)  return 1;
}

void dfs(int* c,int cur,int* vis,int* isp,int n)
{
    if(cur==n+1&&isp[c[1]+c[n]])
    {
        for(int i=1;i<=n;i++)
          {
              if(i!=n)
              cout<<c<<" ";
              else if(i==n)
              cout<<c;
          }
        cout<<endl;
    }
    else for(int i=2;i<=n;i++)
    {
        c[cur]=i;
        if(!vis&&isp[c[cur-1]+i])
        {
            vis=1;
            dfs(c,cur+1,vis,isp,n);
            vis=0;
        }
    }
}

int main()
{
    int isp[100]={0};
    for(int i=1;i<100;i++)
    {
        if(is_prime(i))  isp=1;
    }
int n;
int static tot=0;
while(cin>>n)
{
    int vis[30]={0};
    int c[30]={-1,1};

cout<<"Case "<<++tot<<":"<<endl;
    dfs(c,2,vis,isp,n);
}
    return 0;
}

能AC的:
 #include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void is_prime(int* isp)
{
   for(int i=2;i<=10;i++)
   {
  if(i==0) continue;
  else
      for(int j=i+1;j<100;j++)
   {
    if(j%i==0)
    {
     isp[j]=0;
    }
   }
   }
}
 
void search(int cur,int*a,int* vis,int* isp,int n)
{
 if(cur==n+1)
 {
  if(isp[a[n]+a[1]])
  {
  for(int i=1;i<=n;i++)
  {
   if(i!=n)
   cout<<a<<" ";
         if(i==n)
    cout<<a;
  }
  cout<<endl;
  }
 }
    else
 {
  for(int i=2;i<=n;i++)
  {
   a[cur]=i;
   if(vis==0&&isp[a[cur-1]+i])
   {
    vis=1;
    search(cur+1,a,vis,isp,n);
    vis=0;
   }
  }
 }
}
int main()
{
 int a[25];
 int isp[100];
 memset(isp,-1,sizeof(isp));
    isp[0]=isp[1]=0;
    is_prime(isp);
int n;  int tot=0;
while(scanf("%d",&n)!=EOF)
{
 cout<<"Case "<<++tot<<":"<<endl;
    int vis[25]={0};
 a[1]=1;
    search(2,a,vis,isp,n);
 cout<<endl;
}
   return 0;
}

结尾换行,没有空格! 

原文地址:https://www.cnblogs.com/CKboss/p/3351134.html