/*问题描述:把从1到20这20数摆成一个环,要求相邻的两个数的和是一个素数。*/

#include<iostream>

#include<math.h>

using namespace std;

 

int a[21];

 

void output()

{

int i;

for(i=1;i<=20;i++)

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

cout<<endl;

}

int check1(int i, int n)//与前面的数不相同

{

int j;

for(j=1;j<=n-1;j++)

{

if(a[j]==i)

return 0;

}

return 1;

}

int check2(int n)//素数检查

{

int t=sqrt(n);

int j;

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

{

if(n%j==0)

return 0;

}

return 1;

}

int check3(int i,int n) //检查相邻数字之和是否为素数

{

if(n<20)

return check2(i+a[n-1]);

else

{

int t=check2(i+a[n-1])+check2(i+a[1]);

if(t==2)

return 1;

else

return 0;

}

}

void find(int n)

{

int i;

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

{

if(check1(i,n)==1&&check3(i,n)==1)

{

a[n]=i;

if(n==20)

output();

else

{

find(n+1);

a[n]=0;

}

}

}

}

 

int main()

{

int i;

for(i=1;i<=20;i++)

{

a[i]=0;

}

a[1]=1;

find(2);

return 0;

}