如果做一个速算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 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);
}
}