把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
C++代码:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
//打印结果
void printSolution(const vector<int> &v)
{
for (vector<int>::const_iterator it = v.begin();it != v.end();++it)
{
cout<<*it<<' ';
}
cout<<endl;
}
//检查数字j是否和前面以放的数字重复
bool check1(const vector<int> &v, int i, int j)
{
for (int k=0;k<i;++k)
{
if (j == v[k])
{
return false;
}
}
return true;
}
//检查数n是否是素数
bool check2(int n)
{
int tmp = sqrt(double(n));
for (int k=2;k<=tmp;++k)
{
if (n%k == 0)
{
return false;
}
}
return true;
}
//检查数j是否和第i-1个数的和构成素数,如果i为最后一个位置,则还要检查j和第一个数的和是否构成素数
bool check3(const vector<int> &v,int i,int j)
{
int sz = v.size();
if (i == sz -1 )
{
return check2(v[i-1] + j) && check2(v[0] + j);
}
else
{
return check2(v[i-1] + j);
}
}
//第i个位置放j
void fun(vector<int> &v,int i)
{
for (int j=1;j<=20;++j)
{
if (check1(v,i,j) && check3(v,i,j))
{
v[i] = j;
//放满20个数,则打印结果
if (i == v.size()-1)
{
printSolution(v);
}
else
{
//递归
fun(v,i+1);
}
}
}
}
int main()
{
vector<int> v(20, 0);
v[0] = 1;
fun(v,1);
return 0;
}