我试图编写一个C程序来查找给定数组和指定长度的所有组合。这是我到目前为止所做的......
#include <stdio.h>
void com(int* a, int* t, int len, int i) {
int j, k;
if(len == 0) {
for(k=0;k<3;k++) {
printf("%d ",t[k]);
}
printf("\n");
return;
}
for(j = i ; j <= 4-len ; j++) { // 4 = original array size
t[3-len] = a[j];
com(a,t,len-1,i+1);
}
}
main() {
int t[3];
com((int[]){4,1,3,2},&t[0],3,0); // 3 = combination length
}
此代码中的问题是它没有跳过重复,重复组合的选项。例如,它生成的数组{1,2,3,4}
1 2 3
1 2 4
1 3 3
1 3 4
2 2 3
2 2 4
2 3 3
2 3 4
但它应该生成
1 2 3
1 2 4
1 3 4
2 3 4
我能为此做些什么?我不知道该怎么做。任何形式的帮助将不胜感激。感谢。
此外,如果有替代方案和更优化的解决方案,请随时分享。
答案 0 :(得分:1)
要修复的示例
void com(int *a, int *t, int len, int i){
if(i == len){
for(int k = 0; k < len; k++)
printf("%d ", t[k]);
printf("\n");
return;
}
while(*a){
t[i] = *a;
com(++a, t, len, i+1);
}
}
int main(void){
int t[3];
com((int[]){1,2,3,4, 0}, t, 3, 0);
// ^end mark
return 0;
}
答案 1 :(得分:1)
#include <stdio.h>
int check(int *t)
{
int j,k;
for(k=0;k<3;k++)
{
for(j=k+1;j<3;j++)
{
if(t[k]==t[j])
return 0;
}
}
return 1;
}
void com(int* a, int* t, int len, int i) {
int j, k;
int comb=1;
if(len == 0)
{
comb = check(t);
if(comb)
{
for(k=0;k<3;k++)
{
printf("%d ",t[k]);
}
printf("\n");
}
return;
}
for(j = i ; j <= 4-len ; j++) { // 4 = original array size
t[3-len] = a[j];
com(a,t,len-1,i+1);
}
}
main() {
int t[3];
com((int[]){4,1,3,2},&t[0],3,0); // 3 = combination length
}
抱歉编辑错误..