java速算24,java枚举速算24正解集合

如果做一个速算24的游戏出现这种无解情况

bca1be775517231d7b9d500d963a5f49.png

如何避免生成这种尴尬的数字,这时需要判断是否有解。

这样就需要借鉴一些排列组合的想法

比如 1 2 3 4

排列方式有

1   2   3   4

1   2   4   3

1   3   2   4

1   3   4   2

1   4   3   2

.............

循环 1   与  2  3  4交换位置

for (int i = k; i <= m; i++) {

swap(list, k, i);

}

递归perm(list, k + 1, m);

2 与 3   4  交换位置

3与4交换位置

......

arrange.perm(new Integer[1,2,3,4], 0,3);

public void perm(T list[], int k, int m) {

if (k > m) {

} else {

for (int i = k; i <= m; i++) {

// 每次将k和与k++交换

swap(list, k, i);

// 然后再递归获取稍偏移一位所有组合

perm(list, k + 1, m);

// 替换回原来的组合

swap(list, k, i);

}

}

}

从加减乘除中的排列组合

+   -   *

+   *   -

-   +   *

-   *   +

*   -   +

......

以及..............

+ + -

+ + +

* * *

..........

对于 {+   -   * /}中取三个符合并排列获得不重复的所有组合

创建 new BitSet(3) 来计算值

{0, 1, 2}  --  +  -  *

{0, 1, 3}  --  +  -   /

{0, 2, 3}  --  +  *  /

{1, 2, 3}  --  *  -   /

并且排列 的到集合

最后就是括号了

那么,括号有多少种放法呢?

单括号有

(OXO)XOXO

OX(OXO)XO

OXOX(OXO)

(OXOXO)XO

OX(OXOXO)

双括号

(OXO)X(OXO)

((OXO)XO)XO

(OX(OXO))XO

(OXO)X(OXO)

OX(OX(OXO))

OX((OXO)XO)

最终结果:将以上的结果 循环套循环套循环...................

并且将“(14-11)*8/1=24”  字符串解析并运算 结果出来

打印结果

dea2d501e374a7c035963bfccf701974.png

package demo;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

public class Main {

/**

* @param args

* @throws InterruptedException

*/

public static void main(String args[]) throws InterruptedException {

//---获得随即4位数 如 2 4 3 8

Random r = new Random();

Integer[] nums = { r.nextInt(14) + 1, r.nextInt(14) + 1,

r.nextInt(14) + 1, r.nextInt(14) + 1 };

//----------------------------------------

final List qList=new ArrayList();

//枚举所有组合

Compute24.sort(nums,

new Compute24.Compute24Iterator() {

@Override

public void sort(String result, double num) {

if (num == 24) {

qList.add(result + "=" + (int) num);

System.err.println(result + "=" + (int) num);

} else {

System.out.println(result + "=" + (int) num);

}

}

});

Thread.sleep(1000);

System.err.println("正解组合:"+qList.size());

for(String q:qList)System.err.println(q);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值