知识点:排列枚举
这个题其实就是排列枚举,题目要求最开始是1,然后按照字典序的顺序输出满足的序列,那么就是排列2到n,然后发现范围有点大,那么就用题目的限定,相邻两个数的和是质数,搜索的时候剪枝就行了,这里我判断质数就是直接用的函数,用一次判断一次,不会这筛那筛,自己就这么点数学知识,好在不影响
- #include
-
- using namespace std;
-
- const int N = 25;
-
- int n, order[N], vis[N];
-
- bool isprime(int x) {
- if (x < 2) return false;
- for (int i = 2; i * i <= x; i++) {
- if (x % i == 0) return false;
- }
- return true;
- }
-
- void dfs(int k) {
- if (k == n) {
- cout << 1;
- for (int i = 1; i < n; i++) cout << " " << order[i];
- cout << endl;
- return;
- }
- for (int i = 2; i <= n; i++) {
- if (vis[i]) continue;
- if (!isprime(i + order[k - 1])) continue;
- if (k == n - 1 && !isprime(i + 1)) continue;
- vis[i] = 1;
- order[k] = i;
- dfs(k + 1);
- vis[i] = 0;
- }
- }
-
- int main() {
- int tt = 1;
- while (cin >> n) {
- if (tt > 1) cout << endl;
- cout << "Case " << tt++ << ":\n";
- order[0] = 1;
- dfs(1);
- }
- return 0;
- }