【问题标题】:Permutations without repetition C无重复排列 C
【发布时间】:2018-11-12 21:19:52
【问题描述】:

我有这个重复排列的代码。任何人都可以帮助将其修改为不重复。我想不通。

int array1[] = {1, 2, 3}; //array can be {1,1,2,3} for example also
int array2[3];

void permWithRep (int array1[], int array2[], int last, int index){
int i, len = last+1;

    enter code here
    for ( i=0; i<len; i++ )
    {
        array2[index] = array1[i] ;

        if (index == last){
            for(int i = 0; i < 3; i++) {
                printf("%d ", array2[i]);
            }
            printf("\n");
        }
        else // Recur for higher indexes
            permWithRep (array1, array2, last, index+1);
    }
}

int main()
{
    int len = sizeof(array1)/sizeof(int);
    permWithRep (array1, array2, len-1, 0);
    return 0;
}

【问题讨论】:

  • 你能定义你所说的“重复”吗?这听起来像是一个奇怪的问题,但我没有看到任何重复的代码。也许您正在谈论循环。是否要删除所有循环?这是家庭作业吗?
  • 对于任何不清楚问题术语的人 - en.wikipedia.org/wiki/Permutation#Permutations_with_repetition
  • 你试过什么?你对这个问题有什么不明白的地方?

标签: c permutation repeat


【解决方案1】:

我在少数输入上对此进行了测试,它可以工作。
当然有更好的方法来做到这一点,但这就是我所做的:

#include <stdio.h> 

int array1[] = {1, 2, 3}; //array can be {1,1,2,3} for example also
int array2[3]; 
int fixed[3];



void permWithRep(int array1[], int array2[],int fixed_index[], int size , int level){

    if(level == size) return print_array(array2,size);

    for(int k = 0; k< size; k++){

        if(!is_present_in_fixed(fixed_index,level,k)){
            fixed_index[level] = k;
            array2[level] = array1[k];
            permWithRep(array1,array2,fixed_index,size,level+1);
        }

    }
}

void print_array(int array[], int size){
    for(int k = 0; k < size; k++)printf("%d ",array[k]);
    printf("\n");
}

int is_present_in_fixed(int array[], int size, int element ){
    for(int k =0; k<size;k++)
        if(element == array[k]) return 1;
    return 0;
}



int main()
{
    int len = sizeof(array1)/sizeof(int);
    permWithRep (array1, array2, fixed, len, 0);
    return 0;
}

我做了什么:

  • 添加一个数组 (fixed_index[]),用于跟踪一个排列的已访问过索引。
  • 在循环中,检查当前元素的索引是否属于该排列中已访问过的索引 (is_present_in_fixed(fixed_index,level,k))。
  • 如果是这样,它只是跳过那个元素(它不进入if 语句)。
  • 否则将该元素添加到 visited 以进行该排列并继续递归调用。
  • 当所有数组都被迭代后 (level == size),只需打印包含在 array2 中的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多