• 蓝桥杯 摆动序列 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 } 
  • 相关阅读:
    JAVAWE第一天
    01--2048实例开篇
    10--动作系统(四)动作类中的reverse方法
    09--动作系统(三)使用持续动作
    08--动作系统(二)使用即时动作
    【转】cocos2d-x windows开发环境配置
    07--动作系统(一)
    06--触摸事件响应
    05--简单场景切换与精灵创建
    04--简单菜单使用
  • 原文地址:https://www.cnblogs.com/fx1998/p/12700141.html
Copyright © 2020-2023  润新知