【蓝桥杯2016Java】搭积木、寒假作业(俩全排列)

搭积木

在这里插入图片描述

全排列之后再判断就行了,直接暴

public class Main {
	static int counts=0;
	public static void main(final String[] args) {
		int[]nums= {0,1,2,3,4,5,6,7,8,9};
		f(nums,0);
		System.out.println(counts);
	}
	static void f(int[]nums,int k) {
		if(k==10) {
			if(check(nums))
			counts++;
		}
		for(int i=k;i<10;i++) {
			int t=nums[i];nums[i]=nums[k];nums[k]=t;
			f(nums,k+1);
			t=nums[i];nums[i]=nums[k];nums[k]=t;
		}
	}
	private static boolean check(int[]nums) {
		if(
			nums[0]<nums[1] && nums[0]<nums[2]&&
			nums[1]<nums[3] && nums[1]<nums[4]&&
			nums[2]<nums[4] && nums[2]<nums[5]&&
			nums[3]<nums[6] && nums[3]<nums[7]&&
			nums[4]<nums[7] && nums[4]<nums[8]&&
			nums[5]<nums[8] && nums[5]<nums[9]
		)return true;
		return false;
	}
}

答案768

寒假作业

现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:

□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □

(如果显示不出来,可以参见【图1.jpg】)
每个方块代表1~13中的某一个数字,但不能重复。
比如:
6 + 7 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5

以及:
7 + 6 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5

就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

题目中说乘法交换律后算不同的方案所以最后结果不用处理。

这道题也是用全排列做的,但是优化一下,要不然跑实在挺久的。思路也很简单,比一般的全排列多了点东西,一个是提前判断剪枝,一个是k到达12的时候就判断,因为只选择了12个数,而一共有13个数。

public class Main {
	static int counts=0;
	public static void main(final String[] args) {
		int[]nums= {1,2,3,4,5,6,7,8,9,10,11,12,13};
		f(nums,0);
		System.out.println(counts);
	}
	static void f(int[]nums,int k) {
		if(k>=3 )
		  if(nums[0]+nums[1]!=nums[2]) return ;//对确定的前面三个数字进行等式判断,不符合,就不继续往下搜索
		if(k>=6)
		  if(nums[3]-nums[4]!=nums[5]) return ;//同理进行第二个等式的判断,进行剪枝
		if(k>=9)
		  if(nums[6]*nums[7]!=nums[8]) return ;
		if(k==nums.length-1) {
			if(       nums[0]+nums[1]==nums[2]
					&&nums[3]-nums[4]==nums[5]
					&&nums[6]*nums[7]==nums[8]
					&&nums[9]%nums[10]==0&&
					  nums[9]/nums[10]==nums[11]
			  )
			counts++;
		}
		for(int i=k;i<nums.length;i++) {
			int t=nums[i];nums[i]=nums[k];nums[k]=t;
			f(nums,k+1);
			t=nums[i];nums[i]=nums[k];nums[k]=t;
		}
	}
}

答案64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值