原题链接:蓝桥杯算法提高VIP-排列式
public class Main { public static void main(String[] args) { int a[]={1,2,3,4,5,6,7,8,9}; dfs(0,a); } //全排列算法 public static void dfs(int dept,int a[]) { if (dept==9) { //看了其他的题解后得到一个关键点: //"等号左边只能为4位数,等号右边为5位数,且 x号 左边只能为2位数(3位数结果重复)" //通过结论去推断原因,可能是这样: //当右边为4位数,最大可得结果为 7448=98*76,因为最大是数已经不满足9位数了,那么其他的结果必然都小于9位数,所以右边不能为4位数。 //当右边为5为数,最大结果为74970=98*765,最小为2345=1*2345,满足题目要求的结果就在这范围内。 //当右边为6位数使,最大结果为645498=987*654,最小为23456=1*23456,皆不满足要求(位数超限)。 //那么,当右边为5位数时会有怎样的 情况呢? //因为等号右边为5位数,所以左边为4位数。 //当等号右边为5位数,可能的情况有 : //*X*** || **X*** || ***X** || ***X* (*表示位数) //由于题目说明 乘数交换被认为是相同的,所以去除后两种情况。 //System.out.println(Arrays.toString(a)); int result=a[0]*1000+a[1]*100+a[2]*10+a[3];//根据数组拼接数字 int num1=a[4]; int num2=a[5]*1000+a[6]*100+a[7]*10+a[8]; if(num1*num2==result) { System.out.printf("%d = %d x %d\n",result,num1,num2); } num1=a[4]*10+a[5]; num2=a[6]*100+a[7]*10+a[8]; if(num1*num2==result) { System.out.printf("%d = %d x %d\n",result,num1,num2); } return; } for (int i = dept; i <9; i++) { swap(i,dept,a); dfs(dept+1,a); swap(dept,i,a); } return ; } //交换下标x与y的值 public static void swap(int x,int y,int []a) { int t=a[x]; a[x]=a[y]; a[y]=t; } }
解题思路:
注意事项:
参考代码:
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复