英文:
How to print out every possible arrangement of a given array using recursion
问题
你想要排列并打印给定数组的所有可能组合,但要排除重复项,只保留每个元素的一次使用。下面是修改后的代码以实现这一目标:
#include <stdio.h>
#include <stdlib.h>
typedef struct val_s val_t;
struct val_s
{
float *choices;
int used; // 添加一个标记来跟踪元素是否已经在当前排列中使用过
};
void multiplication_principle(val_t *val, float *sol, int n, int pos)
{
if (pos == n)
{
// 检查是否有重复的元素,如果有则跳过
int isDuplicate = 0;
for (int i = 0; i < n - 1; ++i)
{
for (int j = i + 1; j < n; ++j)
{
if (sol[i] == sol[j])
{
isDuplicate = 1;
break;
}
}
if (isDuplicate)
break;
}
if (!isDuplicate)
{
for (int i = 0; i < n; ++i)
{
printf("%3.0f ", sol[i]);
}
printf("\n");
}
return;
}
for (int i = 0; i < n; ++i)
{
if (!val[i].used) // 仅使用未被标记为已使用的元素
{
sol[pos] = val[i].choices[pos];
val[i].used = 1; // 标记元素为已使用
multiplication_principle(val, sol, n, pos + 1);
val[i].used = 0; // 恢复元素状态,以便下一轮排列使用
}
}
}
int main()
{
val_t *v;
float *sol;
float val[] = {+10, -5, +7, -8};
int n = 4;
v = malloc(n * sizeof(val_t));
if (v == NULL)
{
exit(1);
}
for (int i = 0; i < n; ++i)
{
v[i].choices = malloc(n * sizeof(float));
if (v[i].choices == NULL)
{
exit(1);
}
for (int j = 0; j < n; ++j)
{
v[i].choices[j] = val[j];
}
v[i].used = 0; // 初始化标记为未使用
}
sol = malloc(n * sizeof(float));
if (sol == NULL)
{
exit(1);
}
multiplication_principle(v, sol, n, 0);
return 0;
}
这个修改后的代码将排除重复的排列组合,只保留每个元素的一次使用,就像你所描述的那样。
英文:
We are given an array of elements float val[]={+10, -5, +7, -8};
and i want to print out every possible rearrangement of this matrix using recursion
I have kinda done this but in my textbook the only thing i found close to what i want is the multiplication principle
This is my code
#include <stdio.h>
#include <stdlib.h>
typedef struct val_s val_t;
struct val_s
{
float *choices;
};
void multiplication_principle(val_t *val,float *sol,int n,int pos)
{
if(pos==n)
{
for (int i = 0; i < n; ++i) {
printf("%3.0f ",sol[i]);
}
printf("\n");
return;
}
for (int i = 0; i < n; ++i) {
sol[pos]=val[pos].choices[i];
multiplication_principle(val,sol,n,pos+1);
}
}
int main() {
val_t *v;
float *sol;
float val[]={+10, -5, +7, -8};
int n=4;
v=malloc( n*sizeof(val_t));
if(val==NULL)
{
exit(1);
}
for (int i = 0; i < n ; ++i) {
v[i].choices=malloc(n*sizeof (float ));
if(v[i].choices==NULL)
{
exit(1);
}
for (int j = 0; j < n; ++j) {
v[i].choices[j]=val[j];
}
}
sol=malloc(n* sizeof(float));
if(sol==NULL)
{
exit(1);
}
multiplication_principle(v,sol,n,0);
return 0;
}
And these are the results(not all of them cuz i would have to paste here over 50 or so of them but i think you get the idea)
10 10 10 -5
10 10 10 7
10 10 10 -8
10 10 -5 10
10 10 -5 -5
10 10 -5 7
10 10 -5 -8
10 10 7 10
10 10 7 -5
10 10 7 7
10 10 7 -8
10 10 -8 10
10 10 -8 -5
10 10 -8 7
10 10 -8 -8
10 -5 10 10
10 -5 10 -5
10 -5 10 7
10 -5 10 -8
10 -5 -5 10
10 -5 -5 -5
10 -5 -5 7
10 -5 -5 -8
10 -5 7 10
10 -5 7 -5
10 -5 7 7
10 -5 7 -8
10 -5 -8 10
10 -5 -8 -5
10 -5 -8 7
10 -5 -8 -8
10 7 10 10
10 7 10 -5
10 7 10 7
10 7 10 -8
10 -8 10 -8
10 -8 -5 10
10 -8 -5 -5
10 -8 -5 7
10 -8 -5 -8
10 -8 7 10
10 -8 7 -5
10 -8 7 7
10 -8 7 -8
10 -8 -8 10
10 7 -8 7
10 7 -8 -8
10 -8 10 10
10 -8 10 -5
10 -8 10 7
10 -8 -8 -5
10 -8 -8 7
10 -8 -8 -8
-5 10 10 10
-5 10 10 -5
-5 10 10 7
-5 10 10 -8
-5 10 -5 10
-5 10 -5 -5
-5 10 -5 7
-5 10 -5 -8
-5 10 7 10
-5 10 7 -5
-5 10 7 7
-5 10 7 -8
-5 10 -8 10
-5 10 -8 -5
-5 10 -8 7
-5 10 -8 -8
-5 -5 10 10
-5 -5 10 -5
-5 -5 10 7
-5 -5 10 -8
-5 -5 -5 10
-5 -5 -5 -5
-5 -5 -5 7
-5 -5 -5 -8
-5 -5 7 10
-5 -5 7 -5
-5 -5 7 7
-5 -5 7 -8
-5 -5 -8 10
What i want though is to exclude the repetitions. where i only have the elements used one time like for example
10 -5 7 -8
-5 -10 7 -8
7 -5 10 -8
and so on
答案1
得分: 3
"Never mind i managed to do it (GREIT SUCCESS)"
#include <stdio.h>
#include <stdlib.h>
void permutation(float *val, float *sol, float *mark, int n, int pos)
{
if (pos == n)
{
for (int i = 0; i < n; ++i)
{
printf("%.0f ", sol[i]);
}
printf("\n");
return;
}
for (int i = 0; i < n; ++i)
{
if (mark[i] == 0)
{
mark[i] = 1;
sol[pos] = val[i];
permutation(val, sol, mark, n, pos + 1);
mark[i] = 0;
}
}
}
int main()
{
float *sol;
float *val;
int n = 4;
float *mark;
mark = calloc(n, sizeof(float));
if (mark == NULL)
{
exit(1);
}
val = malloc(n * sizeof(float));
if (val == NULL)
{
exit(1);
}
val = (float[]){+10, -5, +7, -8};
sol = malloc(n * sizeof(float));
if (sol == NULL)
{
exit(1);
}
permutation(val, sol, mark, n, 0);
return 0;
}
And the results
10 -5 7 -8
10 -5 -8 7
10 7 -5 -8
10 7 -8 -5
10 -8 -5 7
10 -8 7 -5
-5 10 7 -8
-5 10 -8 7
-5 7 10 -8
-5 7 -8 10
-5 -8 10 7
-5 -8 7 10
7 10 -5 -8
7 10 -8 -5
7 -5 10 -8
7 -5 -8 10
7 -8 10 -5
7 -8 -5 10
-8 10 -5 7
-8 10 7 -5
-8 -5 10 7
-8 -5 7 10
-8 7 10 -5
-8 7 -5 10
英文:
Never mind i managed to do it (GREIT SUCCESS)
#include <stdio.h>
#include <stdlib.h>
void permutation(float *val,float *sol,float *mark,int n,int pos)
{
if(pos==n)
{
for (int i = 0; i < n; ++i) {
printf("%.0f ",sol[i]);
}
printf("\n");
return;
}
for (int i = 0; i < n; ++i) {
if(mark[i]==0)
{
mark[i]=1;
sol[pos]=val[i];
permutation(val,sol,mark,n,pos+1);
mark[i]=0;
}
}
}
int main() {
float *sol;
float *val;
int n=4;
float *mark;
mark = calloc(n, sizeof(float ));
if(mark==NULL)
{
exit(1);
}
val = malloc(n* sizeof(float ));
if(val==NULL)
{
exit(1);
}
val=(float []){+10, -5, +7, -8};
sol=malloc(n* sizeof(float));
if(sol==NULL)
{
exit(1);
}
permutation(val,sol,mark,n,0);
return 0;
}
And the results
10 -5 7 -8
10 -5 -8 7
10 7 -5 -8
10 7 -8 -5
10 -8 -5 7
10 -8 7 -5
-5 10 7 -8
-5 10 -8 7
-5 7 10 -8
-5 7 -8 10
-5 -8 10 7
-5 -8 7 10
7 10 -5 -8
7 10 -8 -5
7 -5 10 -8
7 -5 -8 10
7 -8 10 -5
7 -8 -5 10
-8 10 -5 7
-8 10 7 -5
-8 -5 10 7
-8 -5 7 10
-8 7 10 -5
-8 7 -5 10
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论