我试图找到一个函数的公式,它可以取两个数字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,根据这两个数字创建一个唯一的数字,可以用作数组的唯一下标。数组中的每个唯一点都将保持状态:x
或YES
。这意味着在此函数结束时,我的数组中应该有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]。
有人有什么想法吗?
答案 0 :(得分:4)
使用它来生成合成:
int composed = 12 * (x - 1) + (y - 1); /*zero based*/
使用
恢复x
和y
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语言计算...)
//或x
和y
已交换...
但是,我建议你多考虑一下你的设计......
答案 2 :(得分:1)
如何使用元素0
到n - 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) {
}
// }
//}