我正在开发德州扑克游戏,我需要从一组卡片中生成所有可能的k个子集(在本例中用数字表示)。这是它到目前为止的样子:
public function getKSubsetsFromArray(arr:Array, k:int):Array {
var data:Array = new Array();
var result:Array = new Array();
combinations(arr, data, 0, arr.length - 1, 0, k, result, 0);
return result;
}
public function combinations(arr:Array, data:Array, start:int, end:int, index:int, r:int, resultArray:Array, resultIndex:int):int {
if (index == r) {
trace(resultIndex, data);
resultArray[resultIndex] = data;
return ++resultIndex;
}
for (var i:int = start; i<=end && end-i+1 >= r-index; i++) {
data[index] = arr[i];
resultIndex = combinations(arr, data, i + 1, end, index + 1, r, resultArray, resultIndex);
}
return resultIndex;
}
我是Actionscript的新手,我的想法是拥有一个带有数字和参数k的数组的函数,并返回一个大小为k的数组Array。然而,一旦我测试了函数,我得到的数组只包含nCk次的最后组合。例如:
var testArray:Array = new Array(1, 2, 3, 4, 5);
trace(getKSubsetsFromArray(testArray, 3));
返回:
0 1,2,3
1 1,2,4
2 1,2,5
3 1,3,4
4 1,3,5
5 1,4,5
6 2,3,4
7 2,3,5
8 2,4,5
9 3,4,5
功能输出
3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5
当然它应该打印一个包含之前列出的所有组合的数组,但它只会打印最后一次合适的次数。
感谢您的帮助。
答案 0 :(得分:0)
错误的原因在于,在创建数组数组时,实际上是使用相同数组(数据)的引用,因此在执行最后一个组合时,数据数组的包含变为3,4,5
索引resultArray
指向数据数组,因此它打印出相同的值。
解决方案: -
if (index == r) {
trace(resultIndex, data);
var result = new Array();
copy(result,data)
resultArray[resultIndex] = result;
return ++resultIndex;
}
注意: -
以上是伪代码,因为我不熟悉actionscript,但你可以实现复制功能,将数据值复制到actionscript语法中。