目录
- 需求;
- 需求该如何分析呢,怎么划分成小需求呢?
- 如何把小需求编排成完整需求;
学有所得
- 学会分析需求,由哪些组成(规则,逻辑等);
- 能把的需求分解成很多子需求、或孙需求、或童孙需求,直到每个需求很清晰可实施地为止
- 学会把各种子孙需求,通过组合编排,最终成为一个完整的大需求解决方案
需求
需求:任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合;
通过初步分析,我们可以得到如下规则:
规则:1、任意1-10中的4个数字;
2、使用加减乘除计算得出24;
3、在任何一次计算中不能出现小数,
比如:(4.0 + 8.0) / (3.0 / 6.0) = 24.0,这种是不算的,虽然最终结果是24,因为3/6=0.5;(8.0 / 3.0) * (4.0 + 5.0) = 24.0,虽然最终为24,但是在第一步结果却是小数,所以不成立;代码如下
/** * 是否为合法的计算结果 * @param result * @return */ public static boolean isValidResult(double result){ if (result<1) { return false; } return result == Math.floor(result); }
4、整个运算中应该使用double类型,因为整数相除,使用int类型,在计算机中,会把余数抹掉,直接取整,这样就会造成结果不正确;
那需求该如何分析呢,怎么划分成小需求呢?
一般来说我们都会通过案例来分析,比如:这个需求,我们使用传统的计算,假设我们已经有这四个数[3,4,8,6],可能会有如下组合:
方案:((4.0 + 8.0) * 6.0) / 3.0=24.0;
方案:((3.0 * 4.0) - 8.0) * 6.0=24.0;
方案:((8.0 - 6.0) * 3.0) * 4.0=24.0;
方案:((4.0 + 8.0) / 3.0) * 6.0=24.0;
方案:(4.0 * 3.0) * (8.0 - 6.0) = 24.0;
方案:(6.0 / 3.0) * (4.0 + 8.0) = 24.0;
我们暂时先分析这个几个方案,大家看到这里,可以先思考一下有什么规律,有什么规则;
....................................................................................................Thinking..............................
从这些方案中,我们可以得出如下蹊跷之处:
1、所有的方案中,都在这四个数的所有可能排列组合中(我记忆之中,应该是高中数学的知识点);
2、我们可以把计算法则归纳为两种,所有的都可以归纳到一下两种中去;
第一、从左到右的依次计算;
第二、两两组合,前两个数计算结果和后两个数的计算结果再次计算;
第三、每个方案都有3个运算符;
不知道大家是不是和我发现的一样不,或者说有更多的发现;我认为不管什么发现都可以先列出来,然后在逐个去去除一些太离谱的发现;
我们再继续顺藤摸瓜,到此我们可以把需求分解如下:
我们继续分析需求,看看是否可以再次分解
从上面的需求中我们可以进一步进行分解
第一、如何获取四个数的所有排列组合?
1、举例,我们继续使用案列来分析,比如 [3,4,8,6]
[3,4,8,6](基准)
[4,3,8,6](第二和第一调换)
[3,8,4,6] [8,3,4,6](第三和第二调换,第二和第一调换)
[3,4,6,8] [3,6,4,8] [6,3,4,8] (第四和第三调换, 第三和第二调换,第二和第一调换)
这样是不是所有的排列组合呢?显然不是?因为还有三种基准进行上面的排列组合,也就是上面每行最后一列
[4,3,8,6](基准2)
[8,3,4,6](基准3)
[6,3,4,8](基准4)
2、通过上面的举例,我们就可以先获取所有的基准组合;
3、通过上面,我们可以知道每种基准的所有组合;
4、通过上面的方法获取的组合会有重复,需要前需要去重;
这样我们就能获取4个数的所有排列组合;我感觉这种获取所有排列组合的算法很笨重(有没有感觉有点想冒泡排序),不优雅,肯定有更优的方案,只是我不知道而已,如果知道的可以留言,谢谢;
所有排列分析到此,是不是还需要继续分析,可以继续思考;本人感觉可以落地了;如果觉得需要继续分析的,可以继续分解,知道自己很清晰,知道怎么干为止(这个因人而异);请看代码;
获取所有基准代码:
double[] array = {3, 4, 6, 8}; List<double[]> resultAllList = new ArrayList<>(); List<double[]> list = new ArrayList<>(); list.add(array); list.add(new double[]{array[1], array[2], array[3], array[0]}); list.add(new double[]{array[2], array[3], array[0], array[1]}); list.add(new double[]{array[3], array[0], array[1], array[2]});
获取每个基准的所有排列组合:
/** * 获取array的所有可能组合 * * @param list * @param array */ public static void getAllArray(List<double[]> list, double[] array) { if (!exists(list, array)) { list.add(array); } for (int i = 1; i < 4; i++) { double[] arrayCopy = Arrays.copyOf(array, array.length); List<double[]> newList = getArrayList(arrayCopy, i); Iterator<double[]> iterator = newList.iterator(); while (iterator.hasNext()) { double[] temp = iterator.next(); if (!
本文介绍了一种使用Java实现24点游戏的算法,通过分解需求,分析数字排列组合与运算规则,得出完整的解决方案。讨论了如何获取四个数字的所有排列,以及如何通过加减乘除计算得出24,强调了分析需求和逐步实现的重要性。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



