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

    xiaoxiao2026-03-27  10

    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); } }
    转载请注明原文地址: https://ju.6miu.com/read-1308230.html
    最新回复(0)