我正在研究一种算法,以确定tic tac toe模型是否有胜利者。虽然有一点扭曲 - 函数has_won?被多次召唤。因此,我正在阅读的书(Cracking the Coding Interview)中的算法问题的作者建议生成每个2 ^ 9个可能的表并将它们散列到表中。
要为每个排列生成唯一键,她将每个板表示为整数(板最初是一个char数组)。整数生成如下:(3 ^ 0)v0 +(3 ^ 1)v1 +(3 ^ 2)v2 + ... +(3 ^ 8)v8其中v如果空格为空则为0,如果为空则为1它是一个X,如果它是O,那就是2。
这是我没有关注的内容。我明白为什么她做了她做的事。但是,保证在大约20,000个可能的电路板中不会有另一个电路板不能与该表示形式共享相同的整数键值?她没有提供证据,我无法直观地理解为什么这是一个独特的数字。
答案 0 :(得分:4)
让我们试着用一个简单的例子来看看它是如何工作的。假设电路板只有两个空格。我知道这不是一个好游戏,但只是作为第一步使用它来显示数字代码如何工作。在这种情况下,整数在您的符号
中(3^0)v0 + (3^1)v1
其中v0和v1告诉我们两个空格是否为空(0)是否为X(1)或者是否为O(2)。现在列举一下案例:
_ _ (3^0) 0 + (3^1) 0 = 0
X _ (3^0) 1 + (3^1) 0 = 1
O _ (3^0) 2 + (3^1) 0 = 2
请注意,填充左侧空格只会生成小于3的数字。现在填满右侧空格。
_ X (3^0) 0 + (3^1) 1 = 3
_ O (3^0) 0 + (3^1) 2 = 6
请注意,在填充右侧空间时,我们只获得三倍的倍数。现在做其余的事。
X X (3^0) 1 + (3^1) 1 = 4
O X (3^0) 2 + (3^1) 1 = 5
X O (3^0) 1 + (3^1) 2 = 7
O O (3^0) 2 + (3^1) 2 = 8
现在我们可以看到每个配置对应一个且只有一个整数。此外,我们可以通过整数除法得到整数的配置。采取倒数第二种情况,7。将其除以3,得到2,余数为1. 2是右手方的配置,1是左边的配置。这适用于上述所有示例。
如果你尝试使用两个以上的方格,你会得到相同的结果。我之所以知道这一点的原因,以及你在帖子中得到证明的方式,就是要意识到基数为三的数字系统会将每个方格的状态保持在其中一个数字中。这就是你描述的编码是如何工作的,以及为什么整数编码中的每个项具有3的幂。这足以说明生成的整数是唯一的。
另一种可能的澄清可能是想象可以处于十种状态中的任何一种状态的方块。将这些调用为0到9.然后是任何普通的十进制数,例如
234
保持每个数字中只有一个正方形的状态,每个正方形配置为您提供一个且只有一个十进制数。用你在帖子中给出的符号写下这个号码
(10^0) 4 + (10^1) 3 + (10^2) 2 = 234
我们有v0 = 4,v1 = 3,v2 = 2。