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

C 我需要为数组下标生成144个唯一的数字,公式取2个数字,c,algorithm,C,Algorithm,我试图为一个函数找到一个公式,它可以取两个数字,x和y,每个数字从1到12(144个组合),并且总是产生一个唯一的结果 我的想法是制作一个数组,combotab[144],其中由x和y生成的公式生成一个唯一的数字用作数组下标,然后哪个元素将保持一个状态YES或NO x和y出现的边很重要,因此x-y组合不能等于y-x组合 下面是一些创建组合的代码: int combotab[SIZE_NEEDED]; int create_combos() { int x, y, j, z; y

我试图为一个函数找到一个公式,它可以取两个数字,x和y,每个数字从1到12(144个组合),并且总是产生一个唯一的结果

我的想法是制作一个数组,
combotab[144]
,其中由x和y生成的公式生成一个唯一的数字用作数组下标,然后哪个元素将保持一个状态
YES
NO

x和y出现的边很重要,因此x-y组合不能等于y-x组合

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

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;
}
这将返回基于给定组合的状态,但请记住,数字出现的顺序并不重要

get_combo_state(10, 2) != get_combo_state (2, 10)
我试着将此作为可能的公式,但结果不太理想:

(x * y + x + y + (x*x) / y) - y
这看起来很容易,因为如果x==12和y==12,很容易看出我需要的只是168个数组元素combotab[168]


有人有什么想法吗?

关于
x*12+y
(如
#定义公式(x,y)((x)*12+(y))

或者更好的情况是
(x-1)*12+y-1
(在C语言中,从一开始计数并不常见…)

//或者交换了
x
y


但是,我建议您对您的设计多考虑一些…

关于
x*12+y
(如
#定义公式(x,y)((x)*12+(y))

或者更好的情况是
(x-1)*12+y-1
(在C语言中,从一开始计数并不常见…)

//或者交换了
x
y


但是,我建议您对您的设计多考虑一点…

使用以下内容生成合成:

int composed = 12 * (x - 1) + (y - 1); /*zero based*/
并使用恢复
x
y

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

int y = (composed % 12) + 1;

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

使用此方法生成合成:

int composed = 12 * (x - 1) + (y - 1); /*zero based*/
并使用恢复
x
y

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

int y = (composed % 12) + 1;

当处理底层内存为单个连续块的数组时,这种习惯用法很常见。以零为基的合成简化了提取算法。

用元素
0
n-1
制作一个所需大小的数组怎么样,将该数组洗牌;然后使用它索引到您的
组合选项卡

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) {
        }
//    }
//}
int indexarray[需要大小];
对于(int k=0;k
用元素
0
n-1
制作一个所需大小的数组怎么样,将该数组洗牌;然后使用它索引到您的
组合选项卡

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) {
        }
//    }
//}
int indexarray[需要大小];
对于(int k=0;k
您是否尝试过类似(x-1)*12+(y-1)的方法?如果可以,最简单的方法是将
combotab
变量更改为二维数组,
int combotab[12][12]
。然后,如果您有
x
y
0
开始,而不是从
1
开始,您可以通过
combotab[x][y]
访问信息。您是否尝试过类似(x-1)*12+(y-1)的方法?如果可以,最简单的方法是将
combotab
变量更改为二维数组,
int combotab[12] [12]
。然后您可以通过
组合选项卡[x][y]访问信息
如果你有
x
y
0
开始,而不是从
1
开始。我不是真的在跟着你,你说的合成、零基和提取算法是什么意思?我将在哪里输入这些变量?所有这些似乎对将来的参考都很有用。“x和y中的公式”是“合成的”。恢复公式允许您从“合成”中获取x和y值。我并没有真正了解您,您所说的合成、零基和提取算法是什么意思?我将在哪里输入这些变量?所有这些似乎都有助于将来的参考。“这里的x和y公式”是“合成”的。恢复公式允许您从“合成”中获取x和y值。