我们正在寻找一种可以帮助我们创建人群的算法。我将通过一个例子更好地解释它:
我们有一组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
每列必须包含所有元素,并且不能在同一行中重复。
非常感谢提前!
答案 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,