您的位置:首页 > 编程语言 > Java开发

蓝桥杯 出栈次序(java题解)

2016-08-16 11:46 302 查看
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。

路边有个死胡同,只能容一辆车通过,是临时的检查站,如图【p1.png】所示。

X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。

如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?

为了方便起见,假设检查站可容纳任意数量的汽车。

显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。
现在足足有16辆车啊,亲!需要你计算出可能次序的数目。


思路:知道卡特兰数的这题可以直接推导出来。不知道也没关系。稍微分析一下也简单。求出栈次序,无非就是问一共有多少种满足要求的排列,满足条件在本题中就是指,只有站中有“车”,才能够出来。假设1,代表进站,0代表出站,出站符合要求的就是指NUM(1)>=NUM(0)。最后生成的01排列就是总数。

方法一:按照逻辑求解,运用递归,耗时较长,约22秒

代码:

import java.util.*;

public class Main {
public static int count = 0;
public static int n = 0;

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
List<String> a = new ArrayList<String>();
for(int i=1; i<=n; i++) {
a.add(i + "");
}
f(a, new ArrayList<String>(), new ArrayList<String>());

System.out.println(count);
in.close();

}

public static void f(List<String> a, List<String> b, List<String> c) {
if(c.size() == n) {
count ++;

return;
}

if(b.size() == 0) {
List<String> b1 = new ArrayList<String>(b);//用新的List传递
List<String> a1 = new ArrayList<String>(a);
b1.add(a1.get(a1.size()-1));
a1.remove(a1.size()-1);
f(a1, b1, c);

return;
}
if(a.size() == 0) {
List<String> b1 = new ArrayList<String>(b);
List<String> c1 = new ArrayList<String>(c);
c1.add(b1.get(b1.size()-1));
b1.remove(b1.size()-1);
f(a, b1, c1);

return;
}

List<String> a1 = new ArrayList<String>(a);
List<String> b1 = new ArrayList<String>(b);
b1.add(a1.get(a1.size()-1));
a1.remove(a1.size()-1);
f(a1, b1, c);

List<String> b2 = new ArrayList<String>(b);
List<String> c2 = new ArrayList<String>(c);
c2.add(b2.get(b2.size()-1));
b2.remove(b2.size()-1);
f(a, b2, c2);

}
}


方法二:根据车数递增,可能的次序数满足Catalan数,用Catalan数公式求解

代码:

public class Main {
public static void main(String[] args) {
int num = 1;
for(int i=1;i<=16;i++) {
num = num*(4*i-2)/(i+1);
}
System.out.println(num);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 蓝桥杯 算法