题目描述
素数被广泛地应用于密码学中,所谓的公钥就是将想要传递的信息在编码时加入砠数,编码之后传给收信人,任何人收到此信息之后,若没有此收信人所拥有的秘钥,则在解密的过程中将会因为分解质因数过久而无法破解信息,可见素数在密码学中的重要性。
现在给你n(2<=n<=16)个正整数1,2,3...n,你的任务是把这n个正整数组成一个环,使得任意相邻的两个整数之和为一个素数,输出有多少种合法方案。
输入
多组输入数据,每组数据只有一个正整数n(2<=n<=16)代表有n个正整数 1,2,3...n
输出
对每组数据,输出一个整数,代表有多少种不同的可行方案数。
样例输入
6 8
样例输出
2 4
算法描述
深度优先搜索。
c++代码
#include<iostream>
#include<cmath>
using namespace std;
bool prime(int n)
{
if (n <= 1)return false;
if (n == 2)return true;
for (int i = 2; i <= pow(n, 0.5); i++)
{
if (n % i == 0)return false;
}
return true;
}
void DFS(bool* visit, int previous, int* num,int n,int first,int &count)
{
int j;
for ( j = 1; j <= n; j++)
{
if (visit[j] == false)
break;
}
if (j > n)
{
if (prime(num[first] + previous) == true)
{
count++;
return;
}
else
{
return;
}
}
int i;
for ( i = 1; i <= n; i++)
if (visit[i] == false&&prime(num[i] + previous) == true)
{
visit[i] = true;
DFS(visit, num[i], num, n,first,count);
visit[i] = false;
}
}
int main()
{
int n;
while (cin >> n)
{
int* num = new int[n + 1];
int count = 0;
for (int i = 1; i <= n; i++)
{
num[i] = i;
}
bool* visit = new bool[n + 1];
for (int j = 1; j <= n; j++)
{
visit[j] = false;
}
visit[1] = true;
DFS(visit, num[1], num, n, 1, count);
cout << count << endl;
}
return 0;
}