用于创建人的子组的算法

时间:2017-02-21 06:44:37

标签: algorithm sorting grouping permutation

我们正在寻找一种可以帮助我们创建人群的算法。我将通过一个例子更好地解释它:

我们有一组5名学生,我们称他们为A,B,C,D,E。给定一个数字(称之为n)小于学生人数(< 5),我们会喜欢为每个学生创建一个n个元素的子组。

例如,给定n = 3,我们需要创建3个子组(SG1,SG2和SG3),可能的结果是

STUDENT -  SG1 - SG2 - SG3

A           B  -  C  -  D
B           C  -  D  -  E
C           A  -  E  -  B   
D           E  -  B  -  A
E           D  -  A  -  C

每列必须包含所有元素,并且不能在同一行中重复。

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

为什么不总是按照以下顺序执行,更容易生成:

a - b,c,d
b - c,d,e
c - d,e,a
d - e,a,b
e - a,b,c

//aka

(  0 - 1,2,3  )  %5
(  1 - 2,3,4  )  %5
(  2 - 3,4,5  )  %5
(  3 - 4,5,6  )  %5
(  4 - 5,6,7  )  %5

我创建了一个类似于上面的生成表单,但在C中使用modulo。您可以在这里尝试: http://ideone.com/n6qBzN

参考代码:

main() {

    char *myString = "ABCDEFGHIJKLMNOP4583";
    int characters = mystrlen(myString);
    int i = 0;
    while (i < characters) {

        printf("%c", myString[i]);
        printf(" - ");

        int a = 1;
        while (a <= characters-2) {
            printf("%c, ", myString[(i+a)%characters]);
            a++;
        }

        printf("\n");

        i++;
    }

}

int mystrlen(char *s) {//arbitrary function for determining number of characters in a string (your initial group set)
    int i =0;
    while (*s++) i++;
    return i;
}

因此,您可以在上面的代码中看到人员组的初始列表是ABCDEFGHIJKLMNOP4583,并生成下表:

A - B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, 4, 5, 8, 
B - C, D, E, F, G, H, I, J, K, L, M, N, O, P, 4, 5, 8, 3, 
C - D, E, F, G, H, I, J, K, L, M, N, O, P, 4, 5, 8, 3, A, 
D - E, F, G, H, I, J, K, L, M, N, O, P, 4, 5, 8, 3, A, B, 
E - F, G, H, I, J, K, L, M, N, O, P, 4, 5, 8, 3, A, B, C, 
F - G, H, I, J, K, L, M, N, O, P, 4, 5, 8, 3, A, B, C, D, 
G - H, I, J, K, L, M, N, O, P, 4, 5, 8, 3, A, B, C, D, E, 
H - I, J, K, L, M, N, O, P, 4, 5, 8, 3, A, B, C, D, E, F, 
I - J, K, L, M, N, O, P, 4, 5, 8, 3, A, B, C, D, E, F, G, 
J - K, L, M, N, O, P, 4, 5, 8, 3, A, B, C, D, E, F, G, H, 
K - L, M, N, O, P, 4, 5, 8, 3, A, B, C, D, E, F, G, H, I, 
L - M, N, O, P, 4, 5, 8, 3, A, B, C, D, E, F, G, H, I, J, 
M - N, O, P, 4, 5, 8, 3, A, B, C, D, E, F, G, H, I, J, K, 
N - O, P, 4, 5, 8, 3, A, B, C, D, E, F, G, H, I, J, K, L, 
O - P, 4, 5, 8, 3, A, B, C, D, E, F, G, H, I, J, K, L, M, 
P - 4, 5, 8, 3, A, B, C, D, E, F, G, H, I, J, K, L, M, N, 
4 - 5, 8, 3, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, 
5 - 8, 3, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, 
8 - 3, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, 4, 
3 - A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, 4, 5,