问题描述
如果一个序列满足下面的性质,我们就将它称为摆动序列:
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
**思路:**都在代码注释中
import java.util.Scanner;
public class Main {
public static int sum=0; //一共有多少种符合题意
public static int []num = new int[22]; //最大是20,长度21就够用了,用来记录第几位是什么数字
public static int []count = new int[22]; //用来记录哪些数字用过了
public static int n; //题目所给的k
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner read = new Scanner(System.in);
n = read.nextInt();
bfs(1);
System.out.println(sum);
}
public static void bfs(int k) //这里的k就是序列中的第k个数字
{
if(k>2)//至少有两个数字了
{
if(k==3)//这里为什么是3,不是2。例子中不是两个数字都可以吗?因为我们的k是从1开始的,当k==2的时候,num[2]中是没有数字的,所以要k==3
{
sum++;
}
else if((num[k-2]-num[k-3])*(num[k-1]-num[k-3])<0)//数组下标从1开始所以多减1
{
sum++;
}
else
{
return;
}
}
//下面这部分代码就是列出所有的情况
for(int i=1;i<=n;i++) //从1开始的数字
{
if(count[i]==0)//为0就是没用过
{
num[k] = i;
count[i] = 1;//标记为用过
bfs(k+1);
count[i] = 0;//回溯了,所以标记成没用过
}
}
return ;
}
}