【问题标题】:Algorithm to implement the BINGO game实现 BINGO 游戏的算法
【发布时间】:2013-10-26 12:42:35
【问题描述】:

不懂BINGO游戏的小伙伴们,玩的方法如下

1) 你得到一张 BINGO 卡,其中有一个随机打印的 NXN 数字矩阵。数字是唯一的。打印的最大数字可以大于 N^2。例如如果你有 5x5 矩阵,那么最大数字也可以是 75。但是数字的范围是预先确定的,比如 1 到 M。

2) 一个人随机说出 1 到 M 范围内的数字。

3)如果号码在你的卡上,你就划掉号码。

4) 交叉数字的过程是重复的。当你越过整行或整列或两条对角线时,你就会得到你的第一个宾果游戏 游戏仍在继续,因为 N 行、N 列和 2 条对角线的 BINGO 总数可能为 N+N+2。

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


我尝试为卡片维护一个二维矩阵

当一个数字被宣布时,我在 O(NxN) 时间内搜索它。当我找到它时,我将它设为 0。

设为0后,搜索对应的行列是否全为零。如果在对角线上,我也搜索对角线。耗时O(3N)。

有更好的方法吗?

【问题讨论】:

  • 是的,尺寸可能会改变!!!这就是为什么我把NxN写成大小

标签: java algorithm matrix


【解决方案1】:

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

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 );

对角线也是如此。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      N^2 次遍历 bingo 卡并将每个数字添加到哈希表中,使用该数字作为键和一个新的坐标作为值。

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

      4N 时间检查布尔数组上每个方向的第一个宾果游戏

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        相关资源
        最近更新 更多