搭积木
全排列之后再判断就行了,直接暴
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