让我们考虑一个bidimensionnal数组,声明如下:
#include <stdbool.h>
bool array[N1][N2];
我必须知道这个数组的每一行是否在同一位置只有一个true
值。
例如,以下是可以的:
{
{ 1, 0, 1, 0 },
{ 1, 0, 0, 1 },
{ 0, 0, 1, 1 }
}
虽然这是不正确的:
{
{ 1, 0, 1, 0 },
{ 1, 0, 1, 0 },
{ 0, 0, 1, 1 }
}
我试过这个:
static uintmax_t hash(const bool *t, size_t n)
{
uintmax_t retv = 0U;
for (size_t i = 0; i < n; ++i)
if (t[i] == true)
retv |= 1 << i;
return retv;
}
static int is_valid(bool n)
{
return n != 0 && (n & (n - 1)) == 0;
}
bool check(bool t[N1][N2])
{
uintmax_t thash[N1];
for (size_t i = 0; i < N1; ++i)
thash[i] = hash(t[i], N2);
for (size_t i = 0; i < N1; ++i)
for (size_t j = 0; j < N1; ++j)
if (i != j && !is_valid(thash[i] & thash[j]))
return 0;
return 1;
}
但它仅适用于N1 <= sizeof(uintmax_t) * CHAR_BIT
。你知道解决它的最佳方法吗?
答案 0 :(得分:1)
不要将这些位打包成一个整数。相反,遍历每两个相邻的行i
和i+1
并求和!(a[i][j] ^ a[i+1][j])
(两行中位的XOR的NOT)。每行的总和必须为1。
注意我使用的是逻辑not
而不是按位not
。我不想得到-1(这是按位而不是0)。
答案 1 :(得分:1)
为什么不创建另一个大小为N2(列数)的数组,将其设置为所有true
,然后and
每行中的每一列。最后,检查新阵列是否只有一个设置位。
bool array[N1][N2]; // this is initialized somehow
bool result[N2];
int i, j;
// initialize result array
for (j = 0; j < N2; ++j)
{
result[j] = 1;
}
// Now go through the array, computing the result
for (i = 0; i < N1; ++i)
{
for (j = 0; j < N2; ++j)
{
result[j] &= array[i][j];
}
}
// At this point, you can check the result array.
// If your array is valid, then result should have only one '1' in it.