参考代码:

import java.util.Scanner;


public class zz摆动序列 {

	/**
	 * @param args
	 */
	static int n;
	static boolean []is;//用于记录是否用过(保证每个数都是不相同的)
	static int []cz;//用于保存摆动序列
	static int num=0;//用于记录摆动序列
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		n=scanner.nextInt();
		is=new boolean[n+1];
		cz=new int[n+1];
		dfs(1);
		System.out.println(num-n);

	}
	
	public static void dfs(int k) {
		if (k>n) {
			return;
		}
		//当只有1个和2个数的时候就不用考虑那么多,只要两个数不相等就行了
		if (k==1||k==2) {
			for (int i = 1; i <= n; i++) {
				if (!is[i]) {
					is[i]=true;
					cz[k]=i;
					num++;
					dfs(k+1);
					//回溯
					is[i]=false;
					cz[k]=0;
					
				}
			}
		}
		else {
			//当前一个数比前前一个数大的时候现在的这个数就要比前一个数小
			if (cz[k-1]>cz[k-2]) {
				//这里范围就是1到前一个数(不能等于前一个数)
				for (int i = 1; i < cz[k-2]; i++) {
					if (!is[i]) {
						is[i]=true;
						cz[k]=i;
						num++;
						dfs(k+1);
						//回溯
						is[i]=false;
						cz[k]=0;
					}
				}
			}
			//当前一个数比前前一个数小的时候现在的这个数就要比前一个数大
			else if (cz[k-1]<cz[k-2]) {
				//所以范围是从前一个数(不能等于前一个数)到n
				for (int i = cz[k-2]+1; i <= n; i++) {
					if (!is[i]) {
						is[i]=true;
						cz[k]=i;
						num++;
						dfs(k+1);
						//回溯
						is[i]=false;
						cz[k]=0;
					}
				}
			}
		}
	}

}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论