Sapphire


私信TA

用户名:1368205885

访问量:4134

签 名:

无限进步!

等  级
排  名 712
经  验 3763
参赛次数 0
文章发表 16
年  龄 18
在职情况 学生
学  校
专  业 软件工程

  自我简介:

   排列组合问题

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分

6 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区