蓝桥杯: 凑算式+寒假作业+ 方格填数+搭积木
这几题都使用了dfs深搜算法,dfs蓝桥杯很多题都可以都可以用到.
一定要掌握!
凑算式
B DEF
A + --- + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
凑算式
答案 : 29
public class Main {
static boolean b[] = new boolean[10]; //声明布尔数组代表该数字是否被访问过
static int count = 0;
static int[] nums = new int[10]; //存1-9
public static void main(String[] args) {
fun(1);
System.out.println(count);
}
// 获得1-9全排列
public static void fun(int m) {
if (m == 10) {
if (check()) {
count++;
}
}
for (int i = 1; i <= 9; i++) {
if (b[i] == false) {
b[i] = true;
nums[m] = i;
fun(m + 1);
b[i] = false;
}
}
}
// 判断是否满足凑算式
public static boolean check() {
double q = nums[1];
double w = nums[2] * 1.00 / nums[3];
double e = (nums[4] * 100 + nums[5] * 10 + nums[6]) * 1.00 / (nums[7] * 100 + nums[8] * 10 + nums[9]);
if (q + w + e == 10.00) return true;
else return false;
}
}
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
每个方块代表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
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
public class Main{
static boolean[] b = new boolean[15];
static int count = 0;
static int[] a = new int[15];
public static void main(String[] args) {
f(1);
System.out.println(count);
}
public static void f(int m) {
if (m == 14) {
if (a[10] == a[11] * a[12]) {
count++;
}
return;
}
if (m == 11) {
if (a[7] * a[8] != a[9]) return;
}
if (m == 8) {
if (a[4] - a[5] != a[6]) return;
}
if (m == 5) {
if (a[1] + a[2] != a[3]) return;
}
for (int i = 1; i <= 13; i++) {
if (!b[i]) {
b[i] = true;
a[m] = i;
f(m + 1);
b[i] = false;
}
}
}
public static boolean check() {
if (a[0] + a[1] == a[2] &&
a[3] - a[4] == a[5] &&
a[6] * a[7] == a[8] &&
a[9] / a[10] == a[11]
) return true;
return false;
}
}
方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
public class Main {
static boolean b[] = new boolean[10];
static int count = 0;
static int[] nums = new int[10];
public static void main(String[] args) {
f(0);
System.out.println(count);
}
private static void f(int m) {
if (m == 10) {
if (check()) {
String s = "";
for (int i = 0; i < 10; i++) {
s += nums[i];
}
System.out.println(s);
count++;
}
}
for (int i = 0; i < 10; i++) {
if (!b[i]) {
b[i] = true;
nums[m] = i;
f(m + 1);
b[i] = false;
}
}
}
private static boolean check() {
if (nums[0] == nums[1] + 1 ||
nums[1] == nums[2] + 1 ||
nums[3] == nums[4] + 1 ||
nums[4] == nums[5] + 1 ||
nums[5] == nums[6] + 1 ||
nums[7] == nums[8] + 1 ||
nums[8] == nums[9] + 1
) return false;
if (nums[0] == nums[4] + 1 ||
nums[1] == nums[5] + 1 ||
nums[3] == nums[7] + 1 ||
nums[4] == nums[8] + 1 ||
nums[5] == nums[9] + 1 ||
nums[2] == nums[6] + 1
) return false;
if (nums[0] == nums[5] + 1 ||
nums[0] == nums[3] + 1 ||
nums[1] == nums[6] + 1 ||
nums[1] == nums[4] + 1 ||
nums[2] == nums[5] + 1 ||
nums[3] == nums[8] + 1 ||
nums[4] == nums[7] + 1 ||
nums[4] == nums[9] + 1 ||
nums[5] == nums[8] + 1 ||
nums[6] == nums[9] + 1
) return false;
if (nums[0] == nums[1] - 1 ||
nums[1] == nums[2] - 1 ||
nums[3] == nums[4] - 1 ||
nums[4] == nums[5] - 1 ||
nums[5] == nums[6] - 1 ||
nums[7] == nums[8] - 1 ||
nums[8] == nums[9] - 1
) return false;
if (nums[0] == nums[4] - 1 ||
nums[1] == nums[5] - 1 ||
nums[3] == nums[7] - 1 ||
nums[4] == nums[8] - 1 ||
nums[5] == nums[9] - 1 ||
nums[2] == nums[6] - 1
) return false;
if (nums[0] == nums[5] - 1 ||
nums[0] == nums[3] - 1 ||
nums[1] == nums[6] - 1 ||
nums[1] == nums[4] - 1 ||
nums[2] == nums[5] - 1 ||
nums[3] == nums[8] - 1 ||
nums[4] == nums[7] - 1 ||
nums[4] == nums[9] - 1 ||
nums[5] == nums[8] - 1 ||
nums[6] == nums[9] - 1
) return false;
return true;
}
}
搭积木
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
public class Main {
static boolean b[] = new boolean[10];
static int[] nums = new int[10];
static int count = 0;
public static void main(String[] args) {
fun(0);
System.out.println(count);
}
public static void fun(int m) {
if (m == 10) {
if (check()) {
count++;
}
}
for (int i = 0; i < nums.length; i++) {
if (b[i] == false) {
b[i] = true;
nums[m] = i;
fun(m + 1);
b[i] = false;
}
}
}
public static boolean check() {
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;
}
}
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。