2020粤澳程序设计热身赛题目A 莫斯方块:
小明今年上一年级了,他特别喜欢玩积木,于是非常喜欢他的数学老师斯捷就给了他三种不同的莫斯方块,莫斯方块是非常神奇的方块,它只有1 * 1, 1 * 2 和 2 * 2的正方形组成。如下图:
现在斯捷老师希望小明可以用一定数量的这三种莫斯方块尽量多的拼凑出3 * 3的莫斯方块。请聪明的你帮帮小明,不然小明可能会留级了。
输入要求
每次先输入一个整数T(1 <= T <= 1000000),接下来T组测试数据
对于每一组数据有三个整数a, b, c (0 <= a, b, c <= 100),分别代表1 * 1、 1 * 2 和 2 * 2的莫斯方块数
输出要求
对于每组测试数据,输出格式为"Case #i: ans",表示第i组测试数据答案为ans。
表示最多可以拼凑出ans个3 * 3的莫斯方块
示例:
输入:
2
1 1 1
1 2 1
输出:
Case #1: 0
Case #2: 1
个人解法(欢迎指正):
public class MossCube {
static int f(int[] c, int[][] b) {
for (int m = 0; m < b.length; m++) {
if (c[0] >= b[m][0] && c[1] >= b[m][1] && c[2] >= b[m][2]) {
c[0] -= b[m][0];
c[1] -= b[m][1];
c[2] -= b[m][2];
return 1 + f(c, b);
}
}
return 0;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
int[][] a = new int[n][3];
int[][] b = {{1, 2, 1}, //b数组的顺序是求方块拼接最大数量的关键,思想是先使用大面积的方块
{3, 1, 1},
{1, 4, 0},
{3, 3, 0},
{5, 0, 1},
{5, 2, 0},
{7, 1, 0},
{9, 0, 0}};
String[][] arrayS = new String[n][3];
int x = 0;
while (sc.hasNext()) {
String s = sc.nextLine();
arrayS[x] = s.split(" ");
x++;
if (x == n) {
break;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < arrayS[i].length; j++) {
a[i][j] = Integer.parseInt(arrayS[i][j]);
}
}
sc.close();
for (int i = 0; i < a.length; i++) {
int[] c = a[i];
System.out.println("Case#" + (i + 1) + ":" + f(c, b));
}
}
}