我正在尝试检查玩家是否无法再移动,但我似乎无法弄清楚如何检查它。假设我有 5 个或更少的图块,每个图块的值在 1 到 3 之间。我想遍历瓷砖并检查是否有任何可能的组合加起来为 10。它不像检查总数那么简单,因为可能有 3 个瓷砖上有 3 个,一个有 2。我已经花了几个小时试图弄清楚这一点....
关于如何检查所有可能的组合的任何想法?我只需要看看一种组合是否可行。一旦找到一个,我就会打破循环以减少检查次数。
编辑:如果它有帮助,如果你下载它,你可以看看我在说什么。它的数字: 21 在 android 上。
游戏的目的是将牌添加到 21。因此,当用户减少到几张牌时,有时即使所有牌的总和超过 21,也无法获得 21 的组合,因为数字加起来并不完全一致21. 这造成了一个问题,因为我无法检查并告诉用户他们丢失了。
在检查它时,我什至不知道从哪里开始。我可以多次循环遍历所有的瓷砖,但事情是一个组合,可能是板上有很多瓷砖。所以我必须检查 3 的组合,然后是 4 ,然后是 5 等等,直到达到剩余的瓷砖数量。我很难准确地解释这一点
更正编辑以供将来参考:
对于我最初的问题如此模棱两可,我深表歉意。碰巧是我在这里问过的第一个问题......这是对问题和解决方案的更好描述。我决定保留以前的文字作为记录。
游戏有许多编号的瓷砖,我必须将它们添加到 21 才能删除。你不能超过 21。它必须是准确的。
我想要检查的是是否还有可以用来精确加起来 21 的瓷砖组合。基本的总和检查不起作用,因为您可能有 5 个 5 号牌并且超过 21 个,但无法再消除。
解决方案
正如@mellamokb 回答需要使用子集和递归一样。基本上,您循环遍历图块,并在每个图块上调用相同的函数两次。一个调用添加当前切片,另一个调用继续下一次迭代而不添加当前切片。如果有任何返回 true,则该函数为 true。基本上是二叉树。
代码
boolean validate(tiles, index, subtotal, total){
if index >= tiles.length return false;
if subtotal == total return true;
return validate(tiles, index + 1, subtotal + tiles[index].number, total) ||
validate(tiles, index + 1, subtotal, total);
}
调用它
validate(tiles, 0, 0, 21)
差不多就行了。