1.运用的dfs思想。
2.判断素数的函数+dfs,dfs中定义一个新的变量t记录走到n的哪一个位置了,如果该数未被搜索到且前后两者的关系满足之和为素数这个条件,我们就把这个数装到a数组里面去。
3.当位置进行到n即最后一个位置时,我就再判断这个最后的一个数是否跟开始的那个数是否满足和是素数这个条件,满足就输出,不满足就继续搜索。
代码如下:(核心代码,输出形式未修改):
#include <iostream>
#include <cmath>
using namespace std;
int a[20];
int n;
bool vis[20];
bool pd(int x, int y) {
int sum = x + y;
for (int i = 2; i <= sqrt(sum); i++) {
if (sum % i == 0) {
return false;
}
}
return true;
}
void print() {
for (int i = 1; i < n; i++) {
cout <<a[i] << " ";
}
cout <<a[n] <<endl;
}
void dfs(int t) {
for (int i = 1; i <= n; i++) {
if (vis[i]==0 && pd(a[t - 1], i)) {
a[t] = i;
vis[i] =1;//标记i这个数已经填充到a这个数组里即素数环里了
if (t == n) {
if (pd(a[1], a[n])&& a[1] == 1) {
print();
}
}
else {
dfs(t + 1);
}
vis[i] = false;
}
}
}
int main()
{
while (cin >> n) {
for (int i = 0; i < 18; i++) {
a[i] = 0;//初始化
}
for (int i = 0; i < 18; i++) {
vis[i] = 0;
}
dfs(1);
}
}
一定要注意vis标记的是这n个数,而不是t位置(这个点弄了好久,一直写不出来)。那就撒花吧!