输出所有的合法的括号组合

本文介绍了如何利用卡特兰数的原理来输出所有合法的括号组合,如()()(), ()(()), (())(), ((()))和(()())。" 133486403,19048838,Python编程:Lambda函数详解与实例,"['Python', '开发语言', '函数式编程']
Implement an algorithm to print all valid (e. g. , properly opened and closed) combinations
of n-pairs of parentheses.
EXAMPLE:
input: 3 (e. g. , 3 pairs of parentheses)

output: ()()(), ()(()), (())(), ((())),(()())



两张方法都用了之前讲过的卡特兰数的原理


void genPar(vector<char> &vt,int sum, int beg, int end, int acc) {
   //第0位置肯定放(,那么和这个左括号匹配的右括号可能的位置是2*i+1,然后按照此类方法再去处理括号里面的元素和括号外面的元素
   
   vt[beg] = '(';
   ++acc;
   if (beg + 1 == end && acc +1 == sum){
       vt[end] = ')';

       for (int j=0; j< sum; ++j)
           cout<<vt[j];
       cout<<endl;
       return;

   }
    for(int i = beg + 1; i<= end; i +=2 ) {
        int tmp = acc;
       
        vt[i] = ')';
        
        if (i - beg >=3)
            genPar(vt,sum,beg+1, i - 1,acc + 1);
       
        if (end - i >=2)
            genPar(vt, sum, i+1,end,acc + i -beg );

    }

}
24点游戏是一种使用扑克牌进行的数学益智游戏,玩家需从一副去掉大小王后的扑克牌中随机抽取四张牌,利用加减乘除四种运算符以及括号改变计算优先级的方式,使得最终结果等于24。每张牌代表一个数值(A=1, J=11, Q=12, K=13),而其他牌则按其面值计数。 对于所有可能的算式组合及算法实现,可以考虑以下几种方法: 枚举法 为了找出所有的可能性,可以通过编程手段穷尽四个数字之间所有可能的操作顺序和操作符选择。考虑到每个位置上的两个数字可以选择不同的运算符,并且还可以插入括号来调整先执行哪个运算,因此总的排列数量会非常大。具体来说,给定四个数字a,b,c,d,则存在如下情况: - 四个数字的不同排序:$4! = 24$ 种 - 对于任意一种排序,有三种放置第一个运算的位置,两种放第二个运算的地方,剩下最后一个自动确定;同时每次都可以独立地选加、减、乘、除之一作为运算符,即共有 $(3!)^3 * 4^3$种不同方式安排运算符及其先后次序。 综上所述,不考虑无效表达式的前提下总的可能性数目为 $24*(3!*4^3)$。 递归回溯算法 编写程序时常用的一种策略是从左向右依次尝试每一个可用的操作数与操作符构建表达式树,在叶子节点处检查是否得到目标值24。当遇到不符合条件的情况就返回并更改之前的选择继续探索其它路径直到遍历完整棵树或者找到了满足条件的答案为止。 遗传算法等启发式搜索 这类高级优化技术适用于解决复杂度较高的问题实例。它们模仿自然界生物进化过程中的自然选择机制——适者生存原则来进行全局最优解搜寻。不过由于24点本身是一个相对简单的NP完全问题,直接采用暴力求解已经足够高效并不推荐使用此类较为复杂的解决方案除非是为了学术研究目的。 Python 示例代码片段用于生成所有合法的24点表达式: ```python from itertools import permutations, product def find_24(nums): ops = ['+', '-', '*', '/'] for num_perm in permutations(nums): # 获得所有数字排列 for op_combination in product(ops, repeat=3): # 得到所有操作符组合 expressions = [ f"({num_perm[0]}{op_combination[0]}{num_perm[1]}){op_combination[1]}({num_perm[2]}{op_combination[2]}{num_perm[3]})", f"{num_perm[0]}{op_combination[0]}(({num_perm[1]}{op_combination[1]}{num_perm[2]}){op_combination[2]}{num_perm[3]})", f"{num_perm[0]}{op_combination[0]}({num_perm[1]}{op_combination[1]}({num_perm[2]}{op_combination[2]}{num_perm[3]}))", f"(({num_perm[0]}{op_combination[0]}{num_perm[1]}){op_combination[1]}{num_perm[2]}){op_combination[2]}{num_perm[3]}" , f"({num_perm[0]}{op_combination[0]}({num_perm[1]}{op_combination[1]}{num_perm[2]})){op_combination[2]}{num_perm[3]}" ] try: if any(abs(eval(expr) - 24) < 1e-6 for expr in expressions): return True, [expr for expr in expressions if abs(eval(expr)-24)<1e-6] except ZeroDivisionError: continue return False, [] nums_example = [3, 3, 8, 8] result, solutions = find_24(nums_example) print(f"Solutions found: {solutions}") ``` 这段脚本定义了一个`find_24()`函数接受一组整数参数表示要处理的具体卡片值列表。它将输出是否存在可行方案以及具体的解答字符串数组。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值