java枚举速算24正解集合

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


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


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

比如 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”  字符串解析并运算 结果出来

打印结果


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<String> qList=new ArrayList<String>();
		//枚举所有组合
		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);
	}

}

Demo下载地址1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值