对于那些不了解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)时间。
有更好的方法吗?
答案 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总运行时间