排列组合问题

Sapphire

2022/2/15

解题思路:
首先我们要知道题目的意思,题目让我们输入4个数据,然后再从中选择3个数据来排列组合,且每次排列组合都要满足从小数开始排列。

我们仔细观察一下答案的格式:

第一次A33:明显选择的是除4以外的三个数,并且从小到大排列

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

第二次A33:我们也不难发现排除了3,并且从小到大排列

1 2 4
1 4 2
2 1 4
2 4 1
4 1 2
4 2 1

因此,我们的思路是,用一个大的外层循环来排除arr[3],arr[2],arr[1]最后是arr[0]。

排除掉这个数字后,我们还要分别确定这剩余三个数的情况(满足从小到大),所以分别设置三个变量来遍历并确定。


注意事项:

(C43*A33/4==A33)//所以每种排除对应6种情况,所以一共有4*6=24种情况。


参考代码:

#include<stdio.h>
int main()
{
    int arr[4];
    int i,j,k,m;
    for(i=0;i<4;i++)
    {
        scanf("%d",&arr[i]);
    }
    for(m=3;m>=0;m--)//控制最外层循环,第一次排除4,第二次排除3 and so on... 
    {
        for(i=0;i<4;i++)//遍历确定第一个数(从1开始,满足从小到大) 
        {
            if(i!=m)//第一个数不能等于所排除数 
            {
                for(j=0;j<4;j++)//遍历确定第二个数
                {
                    if(i!=j&&m!=j)//这第二个数不能等于i,也不能等于m 
                    {
                        for(k=0;k<4;k++)//遍历确定第三个数
                        {
                            if(i!=k&&j!=k&&m!=k)//这第三个数不能等于i,j和m 
                            {
                                printf("%d %d %d\n",arr[i],arr[j],arr[k]);
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

虽然时间复杂度会很高,但总体来说思路相对清晰。

点赞(0)
 

0.0分

6 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论