实现BINGO游戏的算法

时间:2013-10-26 12:42:36

标签: java algorithm matrix

对于那些不了解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)时间。

有更好的方法吗?

3 个答案:

答案 0 :(得分: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 );

对于对角线也是如此。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

N ^ 2次迭代bingo卡,并使用数字作为键并将新坐标作为值,将每个数字添加到哈希表。

n时间迭代将调出的所有数字,从哈希表中检索坐标,并更新布尔数组的状态。如果调用了重复的数字,则必须检索并更新布尔数组,直到哈希表不包含密钥。

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

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