鱼C论坛

 找回密码
 立即注册
查看: 1445|回复: 2

[已解决]我想让数组中的元素不重复的排列组合,但是在while循环的地方出了点问题,求大佬...

[复制链接]
发表于 2022-11-20 19:38:49 | 显示全部楼层 |阅读模式
10鱼币
#include<stdio.h>
void pomp(int n, int a[]);
void print(int a[]);
int judge(int n, int a[])//用来判断一个数组中有没有一样的元素
{
        int temp;
        int num = 0;
        for(int i = 0; i < n; i++)
        {
                temp = a[i];
                for(int j = i + 1; j < n; j++)
                {
                        if(temp == a[j])
                        {
                                num = 1;
                                break;
                        }
                }
                if(num == 1)
                {
                        break;
                }
        }
        return num;
}
void swap(int *p1, int *p2)
{
        int temp;
        temp = *p1;
        *p1 = *p2;
        *p2 = temp;
}
int main()
{
        int a[4] = {1,2,3,4};
        pomp(4, a);
        return 0;
}
void pomp(int n,int a[])
{
        for(int i = 4-n; i < 4; i++)
        {
                int j = 0;
                int b[n];
                for(int i = 0; i < n; i++)
                {
                        b[i] = i + 9;//我的想法是在这里使得b数组中的值都不一样
                }
                if(n > 2)
                {
                        pomp(n-1, a);
                }else
                {
                        print(a);
                }
                swap(&a[4-n], &a[5-n]);
                b[j] = a[4-n];
                j++;
                while(judge(n,b))//我认为在这里出了问题,当b中数组没有重复时,不进入循环,理想状态发现重复后进入循环,让a[n]与a[n+2]交换,用b[j]保存a此时的元素,若b数组依然有重复则让a[n]再与a[n+3]交换,直到b数组中没有重复为止,
                {                                                                  //b数组用来保存a[4-n]~a[3]的值(因为这里a数组的长度为4,所以a[4-n]~a[3]);
                        swap(&a[4-n],&a[5-n+j]);
                        b[j] = a[4-n];
                        if(j != n-2)
                        {
                                b[j] = a[4-n];
                        }else
                        {
                                break;
                        }
                }
        }
}
void print(int a[])
{
        for(int i = 0; i < 4; i++)
        {
                printf("%d ", a[i]);
        }
        printf("\n");
}
最佳答案
2022-11-20 19:38:50
本帖最后由 jhq999 于 2022-11-20 22:20 编辑

数组元素是0~9的数字吗?
数组是不是得去重?
排列时元素只允许出现一次?
  1. #include<stdio.h>
  2. int qucong(int a[],int n)
  3. {
  4.     int i,j,k,m;
  5.     for(i=0;i<n;i+=1)
  6.     {
  7.         for(j=i+1,k=i+1,m=0;j<n;j+=1,k+=1)
  8.         {
  9.             if(a[i]==a[j])k+=1,m+=1;
  10.             a[j]=a[k];
  11.         }
  12.         n-=m;
  13.     }
  14.     return n;
  15. }
  16. int m,b[64],c=0;
  17. int pailie(int a[],int n)
  18. {
  19.     if(0==n)
  20.     {
  21.         for(int i=0;i<m;i+=1)printf("%d",a[b[i]-1]);
  22.         c+=1;
  23.         printf("\n");
  24.     }
  25.     else for(int i=0;i<m;i+=1)
  26.     {
  27.         int j=0;
  28.         for(;j<m;j+=1)if(i==b[j]-1)break;
  29.         if(j==m)
  30.         {
  31.             b[m-n]=i+1;
  32.             pailie(a,n-1);
  33.             b[m-n]=-1;
  34.         }
  35.     }
  36.     return c;
  37. }
  38. int main()
  39. {
  40.     int a[]={1,1,2,3,2,5,4};
  41.     m=qucong(a,sizeof(a)/sizeof(int));
  42.     pailie(a,m);
  43.     return 0;
  44. }
复制代码
  1. 12354
  2. 12345
  3. 12534
  4. 12543
  5. 12435
  6. 12453
  7. 13254
  8. 13245
  9. 13524
  10. 13542
  11. 13425
  12. 13452
  13. 15234
  14. 15243
  15. 15324
  16. 15342
  17. 15423
  18. 15432
  19. 14235
  20. 14253
  21. 14325
  22. 14352
  23. 14523
  24. 14532
  25. 21354
  26. 21345
  27. 21534
  28. 21543
  29. 21435
  30. 21453
  31. 23154
  32. 23145
  33. 23514
  34. 23541
  35. 23415
  36. 23451
  37. 25134
  38. 25143
  39. 25314
  40. 25341
  41. 25413
  42. 25431
  43. 24135
  44. 24153
  45. 24315
  46. 24351
  47. 24513
  48. 24531
  49. 31254
  50. 31245
  51. 31524
  52. 31542
  53. 31425
  54. 31452
  55. 32154
  56. 32145
  57. 32514
  58. 32541
  59. 32415
  60. 32451
  61. 35124
  62. 35142
  63. 35214
  64. 35241
  65. 35412
  66. 35421
  67. 34125
  68. 34152
  69. 34215
  70. 34251
  71. 34512
  72. 34521
  73. 51234
  74. 51243
  75. 51324
  76. 51342
  77. 51423
  78. 51432
  79. 52134
  80. 52143
  81. 52314
  82. 52341
  83. 52413
  84. 52431
  85. 53124
  86. 53142
  87. 53214
  88. 53241
  89. 53412
  90. 53421
  91. 54123
  92. 54132
  93. 54213
  94. 54231
  95. 54312
  96. 54321
  97. 41235
  98. 41253
  99. 41325
  100. 41352
  101. 41523
  102. 41532
  103. 42135
  104. 42153
  105. 42315
  106. 42351
  107. 42513
  108. 42531
  109. 43125
  110. 43152
  111. 43215
  112. 43251
  113. 43512
  114. 43521
  115. 45123
  116. 45132
  117. 45213
  118. 45231
  119. 45312
  120. 45321

  121. Process returned 0 (0x0)   execution time : 0.410 s
  122. Press any key to continue.
复制代码

这是现在的运行结果

这是现在的运行结果

最佳答案

查看完整内容

数组元素是0~9的数字吗? 数组是不是得去重? 排列时元素只允许出现一次?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-20 19:38:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-11-20 22:20 编辑

数组元素是0~9的数字吗?
数组是不是得去重?
排列时元素只允许出现一次?
  1. #include<stdio.h>
  2. int qucong(int a[],int n)
  3. {
  4.     int i,j,k,m;
  5.     for(i=0;i<n;i+=1)
  6.     {
  7.         for(j=i+1,k=i+1,m=0;j<n;j+=1,k+=1)
  8.         {
  9.             if(a[i]==a[j])k+=1,m+=1;
  10.             a[j]=a[k];
  11.         }
  12.         n-=m;
  13.     }
  14.     return n;
  15. }
  16. int m,b[64],c=0;
  17. int pailie(int a[],int n)
  18. {
  19.     if(0==n)
  20.     {
  21.         for(int i=0;i<m;i+=1)printf("%d",a[b[i]-1]);
  22.         c+=1;
  23.         printf("\n");
  24.     }
  25.     else for(int i=0;i<m;i+=1)
  26.     {
  27.         int j=0;
  28.         for(;j<m;j+=1)if(i==b[j]-1)break;
  29.         if(j==m)
  30.         {
  31.             b[m-n]=i+1;
  32.             pailie(a,n-1);
  33.             b[m-n]=-1;
  34.         }
  35.     }
  36.     return c;
  37. }
  38. int main()
  39. {
  40.     int a[]={1,1,2,3,2,5,4};
  41.     m=qucong(a,sizeof(a)/sizeof(int));
  42.     pailie(a,m);
  43.     return 0;
  44. }
复制代码
  1. 12354
  2. 12345
  3. 12534
  4. 12543
  5. 12435
  6. 12453
  7. 13254
  8. 13245
  9. 13524
  10. 13542
  11. 13425
  12. 13452
  13. 15234
  14. 15243
  15. 15324
  16. 15342
  17. 15423
  18. 15432
  19. 14235
  20. 14253
  21. 14325
  22. 14352
  23. 14523
  24. 14532
  25. 21354
  26. 21345
  27. 21534
  28. 21543
  29. 21435
  30. 21453
  31. 23154
  32. 23145
  33. 23514
  34. 23541
  35. 23415
  36. 23451
  37. 25134
  38. 25143
  39. 25314
  40. 25341
  41. 25413
  42. 25431
  43. 24135
  44. 24153
  45. 24315
  46. 24351
  47. 24513
  48. 24531
  49. 31254
  50. 31245
  51. 31524
  52. 31542
  53. 31425
  54. 31452
  55. 32154
  56. 32145
  57. 32514
  58. 32541
  59. 32415
  60. 32451
  61. 35124
  62. 35142
  63. 35214
  64. 35241
  65. 35412
  66. 35421
  67. 34125
  68. 34152
  69. 34215
  70. 34251
  71. 34512
  72. 34521
  73. 51234
  74. 51243
  75. 51324
  76. 51342
  77. 51423
  78. 51432
  79. 52134
  80. 52143
  81. 52314
  82. 52341
  83. 52413
  84. 52431
  85. 53124
  86. 53142
  87. 53214
  88. 53241
  89. 53412
  90. 53421
  91. 54123
  92. 54132
  93. 54213
  94. 54231
  95. 54312
  96. 54321
  97. 41235
  98. 41253
  99. 41325
  100. 41352
  101. 41523
  102. 41532
  103. 42135
  104. 42153
  105. 42315
  106. 42351
  107. 42513
  108. 42531
  109. 43125
  110. 43152
  111. 43215
  112. 43251
  113. 43512
  114. 43521
  115. 45123
  116. 45132
  117. 45213
  118. 45231
  119. 45312
  120. 45321

  121. Process returned 0 (0x0)   execution time : 0.410 s
  122. Press any key to continue.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-20 23:22:04 | 显示全部楼层
jhq999 发表于 2022-11-20 19:38
数组元素是0~9的数字吗?
数组是不是得去重?
排列时元素只允许出现一次?

感谢
感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-23 19:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表