【每日蓝桥】44、一七年省赛Java组真题“纸牌三角形”

你好呀,我是灰小猿,一个超会写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];

扫描二维码关注公众号,回复: 12992734 查看本文章

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;
		}
		
	}

}

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

猜你喜欢

转载自blog.csdn.net/weixin_44985880/article/details/115266899