首页 > 代码库 > C++ P1186 素数环

C++ P1186 素数环

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int N,num[20],p[20],cir[20];

bool is_prime(int x)
{
  if(x<2) return false;
  int m=(int)sqrt(x+0.5);
  for(int i=2;i<=m;i++) if(x%i==0) return false;
  return true;
}

void get_circle(int x)
{
  if(x>N)//填满一圈 ;
  {
    if(is_prime(cir[N]+cir[1]))//检查环的两头,满足就输出一个环;
    {
      for(int i=1;i<=N;i++) printf("%d ",cir[i]);
      printf("\n");
    }
    return;
  }
  if(x==1)//满足由1开头输出一个素数环的要求;
  {
    cir[1]=1;p[1]++;
    get_circle(x+1);
    p[1]--;
    return;
  }
  for(int i=1;i<=N;i++)
  {
    if(x>1&&p[i]<num[i]&&is_prime(cir[x-1]+i))
    {
      cir[x]=i;p[i]++;
      get_circle(x+1);
      p[i]--;
    }
  }
}

int main()
{
  scanf("%d",&N);
  for(int i=1;i<=N;i++) num[i]=1;
  get_circle(1);
  return 0;
}

C++ P1186 素数环