【题目描述】
素数环,给定n,生成排列使得任意两相邻数之和为素数,首尾相加亦为素数
【解析】
为什么使用回溯法而不是生成排列(next_permutation(a,a+size))?
举个例子:
对于n=4
生成排列会去枚举 4!种情况,而回溯法 在遇到不满足前后两项相加为素数的情况下 ,会自动终止,不进入下一层。这样就筛除掉了很多不必要的情况。
【代码】
//素数环,给定n,生成排列使得任意两相邻数之和为素数,首尾相加亦为素数
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn = 100 + 5;
int prime[maxn], vis[maxn];
bool is_prime(int a)
{
for (int i = 2;i <= sqrt(a);i++)
if (a%i == 0) return false;
return true;
}
void dfs(int *a,int cur,int n)
{
if (n == cur && is_prime(a[0] + a[n - 1]))
{
for (int i = 0;i < n;i++) cout << a[i] << ' ';
cout << endl;
return;
}
if (cur >= n) return;
for (int i = 2;i <= n;i++)
{
if (!vis[i] && is_prime(a[cur - 1] + i))
{
a[cur] = i;
vis[i] = 1;
dfs(a, cur + 1, n);
vis[i] = 0;
}
}
}
int main()
{
int cnt = 1;
memset(vis, 0, sizeof(vis));
int n, a[maxn];
a[0] = 1;
cin >> n;
dfs(a, 1, n);
return 0;
}