检查网格/真值表的对称性
Check the symmetry of a grid/truth table
t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f
t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f
是否可以使用 8 输入真值表(例如 OR、AND、XOR 等(确定上述 8x8 的对称性?
假设你的意思和我一样对称,并且你有像bool[][]
或std::vector<std::vector<bool> >
(或char
而不是bool
之类的东西,只要==
工作,这并不重要(,你只需迭代矩阵的一半并与另一半进行比较, 像这样:
bool symmetric = true;
for (unsigned int i = 1; symmetric && i <= n; ++i) {
for (unsigned int j = i+1; symmetric && j <= n; ++j) {
symmetric = (M[i][j] == M[j][i]);
}
}
请注意,您不需要检查对角线,这就是为什么i
在上面的代码中从 1 开始,j
从 i+1
开始。
(我倾向于写比某些人喜欢的更多的括号和大括号。我只是碰巧更喜欢这样编写的代码。
编辑:
你可以有一个64个输入的表,告诉你哪些输入是对称的,当然。通过一些压缩,您可以将该表存储在 2097152 TB 的内存中。我想循环代码可以在您完成加载此表以进行查找之前经常运行。相反,您当然可以将平行于对角线的六条非平凡线输入到相应的真值表中,因为如果它们是对称的,则整个矩阵都是对称的。这些表(用于 2、3、4、5、6、7 和 8 个输入(很容易放入几百个字节。
但无论如何,你对对称性的解释似乎与我的不同。如果您对每一行和/或每列是否对称感兴趣,那么很明显,您可以使用真值表。描边它们需要 256 位,所以如果你的空间真的很短,你可以把它们压缩成 8 位,但当你在上面花费 256 字节时,查找可能会更快。
所以,我在评论中所说的是反复检查某些对并对它们进行"非异或"。
这些对的想法是,如果一行是对称的,则某些对必须相等。请注意,我们零索引数组,我们在每行中都有索引,这些对将具有索引 0 和 7、1 和 6、2 和 5、3 和 4。为了使行对称,所有 4 个都必须是匹配对。总的来说,要使表对称,有 32 对要检查(每行 4 对,超过 8 行(。
NOT XOR 的诀窍在于,由于 XOR 返回 true iff,两者是不同的,该语句的否定返回 true 如果两者相同。
因此,如果你想只使用布尔运算来执行整个检查,你可以把这些对中的每一个,(现在称之为(a,b((和do(NOT(a XOR b(((!(a^b)
在代码中(,然后是所有32个检查的结果。
当然,如果我真的在代码中这样做,我宁愿定期检查相等性。
- 用真值填充矢量
- 布尔真值表 C++
- 查找下一个具有真值C++的数组索引
- 如何从文件显示布尔值表
- 为什么 cal 函数总是返回真值
- 检查网格/真值表的对称性
- 从STL矢量的真值中随机选择索引
- 将真值赋给浮点值
- 读取真值表C++的逻辑运算符表达式
- 检索具有非常量变量数的真值表的单行
- 我的代码中的错误 - 布尔真值表
- 实现真值表的一般模式
- 真值表到按位表达式
- C++建议在用作真值的赋值周围加上括号
- 如何生成一个在真值之后退出的循环
- 二元变量的置换及其值表
- 当观察到的表达式变为真值时中断
- c++中vptr和虚值表的概念
- 简单继承获得虚值表错误
- 如果用户使用了我希望他们使用的值表之外的值,我如何提示他们重新输入?