陈正磊


私信TA

用户名:RossTran

访问量:15034

签 名:

晨兴理荒秽,带月荷锄归。

等  级
排  名 179
经  验 6837
参赛次数 15
文章发表 34
年  龄 0
在职情况 学生
学  校 湖北生物科技职业学院
专  业

  自我简介:

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 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »