我正在尝试用Java编写多人游戏。
我需要创建所有组合的列表并将它们存储在数组中。
如果2名玩家在游戏开始时登录,则组合为: p1,p2和p2,p1(位置很重要)
如果3名玩家登录游戏,则组合为: p1,p2,p3; p1,p3,p2; p2,p1,p3; p2,p3,p1; p3,p1,p2和p3,p2,p1
实际上,我需要一个冗余阵列: 如果有3名玩家登录,我需要提前3组合和每组可能的组合 p1,p2,p3; p1,p3,p2; p2,p1,p3; p2,p3,p1; p3,p1,p2和p3,p2,p1 和 p1,p2和p2,p1 和 p1,p3和p3,p1 和 p2,p3和p3,p2 )
许多玩家(编辑:最多8名玩家)可能同时登录同一轮游戏。 (已编辑:最多有32个组,但这并不重要,因为组是独立的)
是否有快速,简短且简单的方法为n个玩家创建此组合数组?
可以预见并接受递归解决方案。
非常感谢
P.S。
我一直在想的是将小组分成两组,一组选中,其余的玩家。 使用2个FOR循环选择所选择的对,其余的使用第三个。 如果有2个玩家,没有'休息'。如果有3个玩家,2个FORs将选择该对的位置,其余的将获得其余的。 然后,其余的使用相同的拆分程序进行排序。 愿这种方式变得真实吗?怎么样?会有效吗? 再次感谢。
答案 0 :(得分:1)
大小为n的排列数是n!,它呈指数增长。 例如,20个元素的所有排列数为2432902008176640000(~2.43290201×10 ^ 18),数字相当大。
正如您正确猜测的那样,有recursive algorithm用于生成所有排列,但由于上面列出的原因,它在时间和空间上都非常低效。
但是,如果您的任务是生成随机排列,则确实存在一种有效的算法:Fisher–Yates shuffle。它需要O(n)时间(假设你可以在O(1)中生成一个随机整数)和额外内存的O(1)。
答案 1 :(得分:0)
您知道每个数组中的条目数。对于包含所有玩家的阵列,它是256!这是阵列中第一个条目的可能性,下一个条目是255,等等。 256!是一个足够大的数字,我的计算器无法处理它。即使是170名玩家,阵列的大小也是1.3e241。即使在64位计算机上,您也只有1.8e19个可寻址字节。这基本上意味着你需要重新思考你的方法。