原题链接:C语言考试练习题_排列
排列组合问题
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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复