A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Note: the number of first circle should always be 1.
Input
n (0 < n < 20).
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
6 8
Sample Output
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
翻译过来的意思就是要求一个, 以一为开头, 然后相邻的环上的数字加起来是一个素数, 注意是环
然后思路也比较明确, 该题由两部分组成, 第一部分是素数筛, 第二部分是dfs的全排列
首先写一个线性筛法:
#include <iostream>
using namespace std;
const int N = 1e06 + 10;
int q[N], a[N];
int cnt;
void shai(int x) {
for (int i = 2; i <= x; i++) {
if (!a[i]) {
q[cnt++] = i;
}
for (int j = 0; q[j] <= x / i; j++) {
a[q[j] * i] = true;
if (i % q[j] == 0) break;
}
}
}
int main() {
int n;
cin >> n;
shai(n);
cout << cnt;
return 0;
}
然后再写一个全排列的dfs:
#include <iostream>
using namespace std;
int a[10], book[10], n;
void dfs(int step) {
int i;
if (step == n + 1) {
for (i = 1; i <= n; i++) {
cout << a[i];
}
cout << endl;
return ;
}
for (i = 1; i <= n; i++) {
if (book[i] == 0) {
a[step] = i;
book[i] = 1;
dfs(step + 1);
book[i] = 0;
}
}
return ;
}
int main() {
scanf("%d", &n);
dfs(1);
return 0;
}
最后把他们组合在一起, 注意第一个数字是一, 然后判断最后一个和第一个的和也是素数
然后就生成这玩意了:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e06 + 10;
int q[N], cnt, num;
bool prime[N];
void shai(int n) {
for (int i = 2; i <= n; i++) {
if (!prime[i]) q[cnt++] = i;
for (int j = 0; q[j] <= n / i; j++) {
prime[q[j] * i] = true;
if (i % q[j] == 0) break;
}
}
}
bool judge[N]; // 判断是否用过
int p[N]; // 储存排序
void dfs(int n) {
if (n == num) {
if (prime[p[n - 1] + p[0]] == false) {
for (int i = 0; i < num; i++) {
cout << p[i] << ' ';
}
cout << endl;
}
return;
}
for (int i = 2; i <= num; i++) {
if (judge[i] == false && prime[i + p[n - 1]] == false) {
p[n] = i;
judge[i] = true;
dfs(n + 1);
judge[i] = false; // 状态还原
}
}
}
int main() {
judge[1] = true;
p[0] = 1;
int ct = 1;
shai(N);
while (cin >> num) {
cout << "Case " << ct++ << ':' << endl;
dfs(1);
}
return 0;
}
码字不易, 走过路过给个赞啊xdm