你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:纸牌三角形
A,2,3,4,5,6,7,8,9共9张纸牌排成-一个正三角形(A按1计算).要求每个边的和相等.
下图就是- -种排法(如有对齐问题,参看p1.png).
这样的排法可能会有很多.
如果考虑旋转、镜像后相同的算同一种,- -共有多少种不同的排法呢?
请你计算并提交该数字.
注意:需要提交的是-一个整数,不要提交任何多余内容.
解题思路:
对于这道题,其实我们根据蓝桥杯的出题风格,第一个想到的其实就应该是1~9这九个数的全排列,之后对排列好的序列进行判断,计算出三个边每一个边的数值和,判断这三个数值是否相等。至于排列好的数组中哪些数是哪条边的,可以看下图,图中数字代表数组的下标。
int a1 = arr[0] + arr[1] + arr[3] + arr[5];
int a2 = arr[0] + arr[2] + arr[4] + arr[8];
int a3 = arr[5] + arr[6] + arr[7] + arr[8];
判断a1、a2、a3是否相等即可
在计算出所有的符合要求的排列之后,要注意:由于每一个面可以旋转3次,且有镜面2次,所以会重复3*2=6次,所以答案需要除以6
答案源码:
public class Year2017_Bt2 { static int [] initArr = {1,2,3,4,5,6,7,8,9}; static int ans = 0; public static void main(String[] args) { f(initArr,0); //由于每一个面可以旋转3次,且有镜面2次,所以会重复3*2=6次,所以答案需要除以6 System.out.println(ans/6); } //对数组元素进行排列 private static void f(int[] arr, int k) { if(k==arr.length) { //计算出每一个面的数值总和 int a1 = arr[0] + arr[1] + arr[3] + arr[5]; int a2 = arr[0] + arr[2] + arr[4] + arr[8]; int a3 = arr[5] + arr[6] + arr[7] + arr[8]; // 如果三个面的数值都相等,则成立 if (a1==a2&&a2==a3) { ans++; } } for (int i = k; i < arr.length; i++) { int t = arr[k]; arr[k] = arr[i]; arr[i] = t; f(arr, k+1); t = arr[k]; arr[k] = arr[i]; arr[i] = t; } } }
输出样例: