蓝桥杯 凑算式

凑算式


     B      DEF
A + --- + ------- = 10
     C      GHI     
(如果显示有问题,可以参见【图1.jpg】)  
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

答案:29

看到这种题,就直接暴力枚举

之前用的办法是直接九层循环

 for(int a=1;a<10;a++)
			  for(int b=1;b<10;b++)
				  for(int c=1;c<10;c++)
					  for(int d=1;d<10;d++)
						  for(int e=1;e<10;e++)
							  for(int f=1;f<10;f++)
								  for(int g=1;g<10;g++)
									  for(int h=1;h<10;h++)
										  for(int i=1;i<10;i++)
										  {
											  //TODO if( rule(a...i) && Set(a...i) )
										  }

九层循环,然后最里面有一个rule规则判断,再加一个Set,利用set添加无重复性特性,判断(a...i)是不是长度为9的不重复集

这样也能出答案,不过有点慢。

所以就摸索着写一个全排列的东西,以后判断类似的公式呀什么的,可以减少时间

代码如下:

class Main{
	static int count=0;
	public static void main(String[] args) {
		int []a=new int[]{1,2,3,4,5,6,7,8,9};
		f(a,0);
		System.out.println(count);
	}

	private static void f(int[] a, int k) {
		  if(k==a.length)
		  {
			  //TODO  这里产生全排列,只需要在这里做一个判断     if(rule(a)) ....
			  if((a[3]*100+a[4]*10+a[5])*a[2]==(10*a[2]-a[0]*a[2]-a[1])*(a[6]*100+a[7]*10+a[8]))
				  count++;
			  
		  }
		  for(int i=k;i<a.length;i++)
		  {
			  int temp=a[k]; a[k]=a[i]; a[i]=temp;
			  f(a, k+1);
			  temp=a[k]; a[k]=a[i]; a[i]=temp;
		  }
		  
			  
	}
}
去掉 f函数 里面的 if判断,整个代码就是一个全排列的模板,以后遇到不同的题,就换下Rule函数,就可以轻松解题,减少计算机运行的时间。

猜你喜欢

转载自blog.csdn.net/qq_34525938/article/details/79368568