2013-10-26 147 views
0

对于那些谁不知道宾果游戏,它起到如下算法来实现宾果游戏

1)你得到了宾果卡,其中有数字的NXN矩阵随机printed.Numbers是唯一。打印的最大数量可以大于N^2。例如如果你有5x5矩阵,则最大数目可以是75作为well.But数的范围是预先决定说1至M.

2)一个人在到M的范围内随机地1讲出的数字

3)如果号码在您的卡片上,您将跨过号码。

4)交叉数的过程是repeated.When你已经越过一整行或一整列或两条对角线,那么你得到你的第一个宾果 本场比赛仍然继续担任总工商组织类别可能被对于N行,N列和2个对角线,N + N + 2。

现在我想为它创建一个算法。用户将输入随机数,算法会听到它们,并在矩阵(已提供)中交叉它的数字。一旦它得到BINGO它就会声明它。可能是最好的办法


我想它保持着2-d矩阵卡

当数公布,我搜索它在O(N×N的)时间。当时我觉得,我使它为0.

制作完成后它作为0,我搜索它对应的行是否已经全部为零。如果它在对角线上,我也搜索对角线。它需要O(3N)时间。

有没有更好的方法?

+0

是的,大小可改变!!!这就是为什么我写了'NxN'作为尺寸 –

回答

0

您可以为映射到一对(行,列)的每个数字形成映射。

if (myMap[number] exists) { 
    then increment rowCount[ myMap[number].row ]; 
    then increment columnCount[ myMap[number].column ]; 
} 

if (rowCount[myMap[number].row] == N) { bingo! } 
if (columnCount[myMap[number].column] == N) { bingo! } 

myMap.erase(number); 

类似的对角线。

0

使用一个数组来存储卡上的数字,并保持它的排序。号码被呼叫时,使用二进制搜索(O(logN)时间)搜索号码。这应该是一个快速的方法。

0

创建一个类在宾果卡中保存x和y位置的坐标。 NxN布尔值的数组初始化为false,以跟踪宾果卡上的内容。

N^2时间遍历宾果卡,并将每个数字添加到哈希表使用数字作为关键和新的坐标作为值。

n次遍历所有将被调出的数字,从散列表中检索坐标并更新布尔数组的状态。在调用重复号码的情况下,您必须检索并更新布尔数组,直到哈希表不包含密钥。

4N时间检查每个方向布尔阵列上对第一宾果

N^2 + N * 4N总运行时间