[分析]暴力穷举24点的运算量如何缩小?(1)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

设要测试的模式如下:
a [] b [] c [] d
考虑四个数字可以打乱顺序,则有4*3*2*1=24种排列:
abcd abdc acbd acdb adbc adcb
bacd badc bcad bcda bdac bcca
cabd cadb cbad cbda cdab cdba
dabc dacb dbac dbca dcab dcba
一共有三个运算符空位,则共4*4*4=64种排列:
+++  ++-  ++*  ++/  +-+  +--  +-*  +-/  
+*+  +*-  +**  +*/  +/+  +/-  +/*  +//  
-++  -+-  -+*  -+/  --+  ---  --*  --/  
-*+  -*-  -**  -*/  -/+  -/-  -/*  -//  
*++  *+-  *+*  *+/  *-+  *--  *-*  *-/  
**+  **-  ***  **/  */+  */-  */*  *//  
/++  /+-  /+*  /+/  /-+  /--  /-*  /-/  
/*+  /*-  /**  /*/  //+  //-  //*  ///  
再考虑括号,由于双括号可以包括单括号和无括号在内的所有情况,因此只需考虑双括号。
双括号共5种排列:
((a[]b)[]c)[]d  以下简称括号1
(a[](b[]c))[]d  以下简称括号2
a[]((b[]c)[]d)  以下简称括号3
a[](b[](c[]d))  以下简称括号4
(a[]b)[](c[]d)  以下简称括号5
以上所有排列,全部计算即共24*64*5=7680种排列方式。

考虑到操作符的组合最多,但经过反复组合后有可能产生同样的结果。根据此种特性,将64种操作符组合分为20组。
1、+++:1
无论进行怎样的交换和括号,都只有一种结果。
2、---:4
((a-b)-c)-d => a-b-c-d 保留 bcd可交换 24=>4
(a-(b-c))-d => a-b+c-d 重复
a-((b-c)-d) => a-b+c+d 重复
a-(b-(c-d)) => a-b+c-d 重复
(a-b)-(c-d) => a-b-c+d 重复
3、***:1
无论进行怎样的交换和括号,都只有一种结果。
4、///:
((a/b)/c)/d => a/(b*c*d) 重复
(a/(b/c))/d => a*c/(b*d) 重复
a/((b/c)/d) => a*c*d/b 重复
a/(b/(c/d)) => a*c/(b*d) 重复
(a/b)/(c/d) => a*d/(b*c) 重复

(未完待续)

转载于:https://my.oschina.net/u/121125/blog/94286

你可能感兴趣的:([分析]暴力穷举24点的运算量如何缩小?(1))