无重复排列 C
Permutations without repetition C
我有这个用于重复排列的代码。任何人都可以帮助将其修改为不重复。我想不通。
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;
}
我在几个输入上测试了这个并且它有效。
当然有更好的方法,但这就是我所做的:
#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
. 中包含的结果
我有这个用于重复排列的代码。任何人都可以帮助将其修改为不重复。我想不通。
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;
}
我在几个输入上测试了这个并且它有效。
当然有更好的方法,但这就是我所做的:
#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
. 中包含的结果