Problem Description
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.
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.
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
Source
思路:循环加和,递归求解
代码:
#include<iostream> #include<math.h> #include<string.h> using namespace std; int vis[50];//标记访问数组 int ans[50];//定义循环数组 int N; bool is_prime(int n)//判断是否为素数,可以使用打表的方式 { int i, j; if (n < 2) { return false; } for (i = 2; i <= sqrt(n); i++) { if (n%i== 0) { return false; } } return true; } void out_put()//输出满足循环和为素数 { int i; for (i = 1; i < N; i++) { cout << ans[i] << " "; } cout << ans[i] << endl; } void DFS(int step)//深度优先 递归调用 { if (step == N&&is_prime(ans[N] + 1))//到达递归出口 { out_put(); return; } else { for (int i = 2; i <= N; i++) { if (vis[i] == 0 && is_prime(ans[step] + i))//未访问,并且相邻加和为1 { ans[step + 1] = i;//赋值给输出数组 vis[i] = 1;//标记为访问 DFS(step + 1);//深度递归下去 vis[i] = 0;//标记为未访问 } } } } int main() { int t = 1; while (cin >> N) { //cout << is_prime(N) << endl; memset(vis,0, sizeof(vis));//访问数组初始化 ans[1] = 1; cout << "Case " << t <<":"<< endl;//注意:输出一定要按照题目所给出的格式进行,否则报错 DFS(1); t++; cout << endl; } return 0; }