我需要为数组下标生成144个唯一数字,其公式为2个数字

时间:2014-10-21 09:02:38

标签: c algorithm

我试图找到一个函数的公式,它可以取两个数字x和y,每个数字从1-12(144种组合)开始,并且总是会产生一个独特的结果。

我的想法是我创建一个数组combotab[144],其中由x和y生成的公式产生一个唯一的数字,用作数组下标,然后该元素将保持状态{{ 1}}或YES

x和y出现的边很重要,因此x y combo不能等于y x combo。

以下是创建组合的一些代码:

NO

为了重申我所提出的问题,我需要能够完成int combotab[SIZE_NEEDED]; int create_combos() { int x, y, j, z; y = x = 1; for (j = 0; j < 144; j++) for (x = 1; x <= 12; x++) for (y = 1; y <= 12; y++){ if (combotab[FORMULA IN x AND y HERE] == YES){ printf("Possible duplicate, find a better formula\n"); return 0; } else combotab[FORMULA IN x AND y HERE] = YES; } return 1; } x的所有组合,其中y从1-12开始,并且然后y经过1-12,根据这两个数字创建一个唯一的数字,可以用作数组的唯一下标。数组中的每个唯一点都将保持状态:xYES。这意味着在此函数结束时,我的数组中应该有144个唯一的NO状态。

(请注意,变量YES是全局的,因此所有元素都初始化为combotab[]0。)

在此之后,我将创建一个函数来根据数字组合来获取状态:

NO

这将根据给定的组合返回状态,但请记住数字出现的顺序很重要。

int get_combo_state(x, y);

我尝试过这个可能的公式,但它并没有太顺利:

get_combo_state(10, 2) != get_combo_state (2, 10)

这看起来很简单,因为如果x == 12和y == 12,很容易看到我需要的是168个数组元素combotab [168]。

有人有什么想法吗?

3 个答案:

答案 0 :(得分:4)

使用它来生成合成:

int composed = 12 * (x - 1) + (y - 1); /*zero based*/

使用

恢复xy
int x = composed / 12 + 1; /*using integer division*/

int y = (composed % 12) + 1;

当使用底层内存是单个连续块的数组时,这个习惯用法很常见。基于零的组合简化了提取算法。

答案 1 :(得分:1)

x * 12 + y怎么样 (比如#define FORMULA(x,y) ((x) * 12 + (y)))?

或更好的情况(x - 1) * 12 + y - 1(通常用C语言计算...)

//或xy已交换...

但是,我建议你多考虑一下你的设计......

答案 2 :(得分:1)

如何使用元素0n - 1创建所需大小的数组,将该数组洗牌;然后用它来索引你的combotab

int indexarray[SIZE_NEEDED];
for (int k = 0; k < SIZE_NEEDED; k++) indexarray[k] = k;
shuffle(indexarray); /* writing shuffle() is left as an exercise to the reader */

//for (x...) {
//    for (y...) {
        if (combotab[indexarray[y * (ROW_SIZE) + x]] == YES) {
        }
//    }
//}