JAVA 蓝桥杯算法训练 摆动序列

问题描述
  如果一个序列满足下面的性质,我们就将它称为摆动序列:
  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 ;
	}

}

发布了4 篇原创文章 · 获赞 0 · 访问量 29

猜你喜欢

转载自blog.csdn.net/weixin_43824233/article/details/105600411