题目描述
一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数。如下图是一个大小为6的质数环。为了方便描述,规定数环上的第一个数字总是1。若两个质数环,数字排列顺序相同则视为本质相同。现在要求你求出所有本质不同的数环。
输入格式
只有一个数N,表示需求的质数环的大小。
输出格式
每一行描述一个数环,如果有多组解,按照字典序从小到大输出
有了数据范围,打表省时(isprime
)
#include <iostream>
using namespace std;
bool isprime[34] = { 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,
1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 },
vis[20];
int Pc[20];
int n;
void Print() {
for (int i = 1; i <= n; i++) cout << Pc[i] << ' ';
cout << endl;
}
void Dfs(int d) {
if (d == n + 1) {
if (isprime[Pc[n] + Pc[1]] == 1)
Print();
return;
}
for (int i = 1; i <= n; i++) {
if (vis[i] == 0 && isprime[i + Pc[d - 1]] == 1) {
vis[i] = 1, Pc[d] = i;
Dfs(d + 1);
vis[i] = 0;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
Pc[1] = 1, vis[1] = 1;
Dfs(2);
}
最后环首环尾别忘了判断~~