题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
A,2,3,4,5,6,7,8,9 共 9 张纸牌排成一个正三角形(A 按 1 计算)。要求每个边的和相等。 下图就是一种排法。
这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
请你计算并提交该数字。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
解题思路:
这是一道填空题,考生只需要提交最终答案即可,不需要上传自己的程序,故无需优化算法的时间复杂度。这里考虑使用暴力求解。首先对这道题进行模型的转化,很多人看到这样的三角形就会很难想到不知道从何下手如何存储类似的问题,但是完全可以把这个三角形进行转化,把他平铺开来看成一条直线,转化方式可视化如下图所示。
可以看到这里总共有九个数字,那么可以很容易联想到定义九个变量,然后设置一个九重循环(虽然看起来算法时间复杂度很恶心,但是这里的数据量并不是很多,所以程序的运行时间还是蛮快的),然后进行循环操作,对每一次的循环都进行一次判断,首先是保证九个数字之间彼此之间互不相同,其次是保证 a + b + c + d 的值会等于 d + e + f + g 也等于 a + i + h + g,这里就满足了原模型中三角形中的每一边的和相等的条件。但是这个时候的解还不是最终的正确答案,需要看到题目中的提示,考虑旋转、镜像后相同的算同一种,故这里需要将前面得到的结果除以 6,因为旋转后相同的结果有三种,镜像后相同结果的也有三种,故该算法的 Java 实现如下:
public class Main{
public static void main(String[] args) {
int a, b, c, d, e, f, g, h, i, sum = 0;
for (a = 1; a <= 9; a++) {
for (b = 1; b <= 9; b++) {
for (c = 1; c <= 9; c++) {
for (d = 1; d <= 9; d++) {
for (e = 1; e <= 9; e++) {
for (f = 1; f <= 9; f++) {
for (g = 1; g <= 9; g++) {
for (h = 1; h <= 9; h++) {
for (i = 1; i <= 9; i++) {
if (a != b && a != c && a != d && a != e && a != f && a != g && a != h
&& a != i && b != c && b != d && b != e && b != f && b != g && b != h
&& b != i && c != d && c != e && c != f && c != g && c != h && c != i
&& d != e && d != f && d != g && d != h && d != i && e != f && e != g
&& e != h && e != i && f != g && f != h && f != i && g != h && g != i
&& h != i) {
if (a + b + c + d == d + e + f + g && a + b + c + d == a + i + h + g) {
sum++;
}
}
}
}
}
}
}
}
}
}
}
System.out.println(sum / 6);
}
}