问题描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: 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
记:
注意题目给的条件(当数字大于2时的条件判断,不满足时立即跳出)
AC代码:
1 #include <stdio.h> 2 #define N 20 3 4 int k; 5 int count = 0; 6 int use[N+1] = {0}; /*数据存储*/ 7 int vis[N+1] = {0}; /*访问标记*/ 8 9 void dfs(int x) 10 { 11 int i,j; 12 int flag; 13 if (x >= 2) 14 { 15 count ++; 16 } 17 18 if (x > k) 19 { 20 return ; 21 } 22 23 for (i = 1 ; i <= k ; i ++) 24 { 25 if (!vis[i]) 26 { 27 flag = 0; 28 use[x] = i; 29 for (j = x ; j >= 2 ; j --) 30 { 31 if (use[j-1]>use[j-2] && use[j]>use[j-2]) 32 { 33 flag = 1; 34 break; 35 } 36 else if (use[j-1]<use[j-2] && use[j]<use[j-2]) 37 { 38 flag = 1; 39 break; 40 } 41 } 42 if (flag) 43 continue; 44 vis[i] = 1; 45 dfs(x+1); 46 vis[i] = 0; 47 } 48 } 49 50 return ; 51 } 52 53 int main(void) 54 { 55 scanf("%d",&k); 56 dfs(0); 57 printf("%d",count); 58 59 return 0; 60 }