打印C中阵列的所有独特组合...我认为非常接近

时间:2013-04-20 19:16:29

标签: c

这是一项家庭作业。我接近完成它,但我无法克服最后的驼峰。 我打印了一个阵列的所有可能组合,但我无法弄清楚如何从所有组合中挑选出独特的组合。 我已经尝试过这种方式和其他一些变体,但我无法使它工作,我无法弄清楚为什么。 Size是数组的长度,包括终止输入的-1值。 Rowdata是一个maxsize为25的数组.PrintFx只是一个打印函数,带有一个四个循环来打印最终的数组。谢谢, 这是代码:

void RearrangeArray(int rowdata[],int Size)
{
int firstindex;//This is the loop control variable which controls the first permutation of the array
int secondindex;//This is the index control variable that controls the second variables     in the array
int temp[MAXROW]= {0};
int thirdindex = 0;

for (firstindex = 0; firstindex<=Size-1; firstindex++)
  {
  for (secondindex=firstindex+1; secondindex<=Size-1; secondindex++)
    {
     if(rowdata[firstindex]!=rowdata[secondindex] || thirdindex == 0)
     {
      temp[firstindex]=rowdata[firstindex];
      rowdata[firstindex]=rowdata[secondindex];
      rowdata[secondindex] = temp[firstindex];
      if(rowdata[firstindex] == rowdata[secondindex])
      {
        thirdindex=thirdindex+1;
      }
      PrintFx(rowdata, Size);
     }
    }
  }
}

Enter row data: 43101 57784 43101 57784 43101 -1
Combination #1: 57784 43101 43101 57784 43101
Combination #2: 43101 57784 43101 57784 43101
Combination #3: 57784 57784 43101 43101 43101
Combination #4: 43101 43101 57784 57784 43101
Combination #5: 43101 43101 43101 57784 57784
Combination #6: 43101 57784 57784 43101 43101
Combination #7: 43101 57784 43101 43101 57784

3 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

typedef struct pair {
    int data;
    int n;
} Kind;

int cmp(const void *a, const void *b){
    return ((Kind*)a)->data - ((Kind*)b)->data ;
}

Kind *uniq(int data[], int *size){
    int i, pos;
    Kind *wk;

    wk = (Kind*)malloc(*size*sizeof(Kind));
    for(i=0;i<*size;++i){
        wk[i].data = data[i];
        wk[i].n = 1;
    }
    qsort(wk, *size, sizeof(Kind), cmp);
    pos=0;
    for(i=1;i<*size;++i){
        if(wk[pos].data != wk[i].data){
            wk[++pos].data = wk[i].data;
        } else {
            wk[pos].n += 1;
        }
    }
    *size = pos + 1;//new size
    wk = realloc(wk, *size*sizeof(Kind));

    return wk;
}

void print(Kind data[], int ksize, int store[], int size, int depth){
    int i;
    if(depth == size){
        printf("[ ");
        for(i=0;i<size;++i){
            printf("%d ", store[i]);
        }
        printf("]\n");
        return;
    }
    for(i=0;i<ksize;++i){
        if(data[i].n != 0){
            store[depth]=data[i].data;
            data[i].n -= 1;//update
            print(data, ksize, store, size, depth+1);
            data[i].n += 1;//restore
        }
    }
}

void printCombo(int data[], int size){
    Kind *uniq_data;
    int uniq_data_size = size;
    int *wk;

    uniq_data=uniq(data, &uniq_data_size);

    wk=(int*)malloc(size*sizeof(int));
    print(uniq_data, uniq_data_size, wk, size, 0);
    free(wk);
    free(uniq_data);
}

int main(void){
    int data[] = {43101, 57784, 43101, 57784, 43101};
    int size = sizeof(data)/sizeof(int);

    printCombo(data, size);
    return 0;
}
/*
[ 43101 43101 43101 57784 57784 ]
[ 43101 43101 57784 43101 57784 ]
[ 43101 43101 57784 57784 43101 ]
[ 43101 57784 43101 43101 57784 ]
[ 43101 57784 43101 57784 43101 ]
[ 43101 57784 57784 43101 43101 ]
[ 57784 43101 43101 43101 57784 ]
[ 57784 43101 43101 57784 43101 ]
[ 57784 43101 57784 43101 43101 ]
[ 57784 57784 43101 43101 43101 ]
*/

答案 1 :(得分:1)

本程序说明了关于给定字符串的所有组合

例如: 如果给定字符串是ICON,则可能的组合是

ICON  ICNO  IOCN  IONC  INCO  INOC  CION  CINO  硬币  CONI  CNIO  CNOI  OICN  OINC  OCIN  OCNI  ONIC  ONCI  NICO  NIOC  NCIO  NCOI  NOIC  NOCI

#include<stdio.h>
#include<string.h>
//char digits[]="0123456789";
char digits[10][5]=
{
    "ICON","CREW","FARM","OILY","CHOP","ARID","FUND","WAIT","GNAT","TEAR"
};

char str[10];
int top=0;

void push(char a) 
{
    str[top++]=a;
}

char pop() 
{
    return(str[--top]);
}

void generate(char dig[15],int n) 
{
    int i;
    char dig2[15];
    if(n==0) 
    {
        push('\0');
        printf("\n %s",str);
        pop();
    } 
    else 
    {
        for(i=0;dig[i]!='\0';i++) 
        {
            if(dig[i]!=' ') 
            {
                strcpy(dig2,dig);
                push(dig[i]);
                dig2[i]=' ';
                generate(dig2,n-1);
                pop();
            }
        }
    }
}

void main() 
{
    int i;

    for(i=0;i<10;i++) 
    {
        generate(digits[i],4);
    }
} 

http://forgetcode.com/C/1418-Program-For-All-Combination-of-the-Given-String

您可以根据自己的要求轻松修改它。

答案 2 :(得分:0)

组合我和你的对应表。

[ 43101 43101 43101 57784 57784 ]#5
[ 43101 43101 57784 43101 57784 ]
[ 43101 43101 57784 57784 43101 ]#4
[ 43101 57784 43101 43101 57784 ]#7
[ 43101 57784 43101 57784 43101 ]#2
[ 43101 57784 57784 43101 43101 ]#6
[ 57784 43101 43101 43101 57784 ]
[ 57784 43101 43101 57784 43101 ]#1
[ 57784 43101 57784 43101 43101 ]
[ 57784 57784 43101 43101 43101 ]#3

Combination #1: 57784 43101 43101 57784 43101
Combination #2: 43101 57784 43101 57784 43101
Combination #3: 57784 57784 43101 43101 43101
Combination #4: 43101 43101 57784 57784 43101
Combination #5: 43101 43101 43101 57784 57784
Combination #6: 43101 57784 57784 43101 43101
Combination #7: 43101 57784 43101 43101 57784