蓝桥杯 摆动序列 dfs

问题描述
  如果一个序列满足下面的性质,我们就将它称为摆动序列:
  1. 序列中的所有数都是不大于k的正整数;
  2. 序列中至少有两个数。
  3. 序列中的数两两不相等;
  4. 如果第i – 1个数比第i – 2个数大,则第i个数比第i – 2个数小;如果第i – 1个数比第i – 2个数小,则第i个数比第i – 2个数大。
  比如,当k = 3时,有下面几个这样的序列:
  1 2
  1 3
  2 1
  2 1 3
  2 3
  2 3 1
  3 1
  3 2
  一共有8种,给定k,请求出满足上面要求的序列的个数。
输入格式
  输入包含了一个整数k。(k<=20)
输出格式
  输出一个整数,表示满足要求的序列个数。
样例输入
3
样例输出
8
转载自https://blog.csdn.net/xiaoliangxiansheng/article/details/21475569
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[25];
 4 bool vis[25];
 5 int n;
 6 int ans;
 7 bool check(int num, int k){
 8     if (k == 1 || k == 2) {
 9         return true;
10     }
11     if (a[k - 1] > a[k - 2] && num < a[k - 2]) {
12         return true;
13     }
14     if (a[k - 1] < a[k - 2] && num > a[k - 2]) {
15         return true;
16     }
17     return false;
18 }
19 void dfs(int id) {
20     if (id > n) {
21         return;
22     }
23     for (int i = 1; i <= n; i++) {
24         if (!vis[i] && check(i, id)) {
25             vis[i] = true;
26             a[id] = i;
27             if (id >= 2) {
28                 ans++;
29                 /*for(int i=1;i<=cur;i++){
30                     cout<<a[i]<<" ";
31                 }
32                 cout<<endl;
33                 */
34             }
35             dfs(id + 1);
36             vis[i] = false;
37         }
38     } 
39 }
40 int main() {
41     cin >> n;
42     dfs(1);
43     cout << ans << endl;
44     return 0;
45 } 
原文地址:https://www.cnblogs.com/fx1998/p/12700141.html