蓝桥杯------2015 Java B组 国赛:五星填数

本文介绍了一种五星填数问题的解决方法,通过DFS搜索算法找出所有符合条件的填数方案,并考虑了旋转与镜像重复的情况。最终给出了有效方案的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题:五星填数 

如【图1.png图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。

如图就是恰当的填法。

请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。

请提交表示方案数目的整数,不要填写任何其它内容。

 首先给每个点编号可以得到

所以每条边的和相当于

 res[0] + res[2] + res[5] + res[8];
 res[0] + res[3] + res[7] + res[9];
 res[1] + res[2] + res[3] + res[4];
 res[1] + res[5] + res[6] + res[9];
 res[8] + res[6] + res[7] + res[4];

然后用dfs让每个点进行全排列,判断每条边是否相等进行筛选

public class Main {
	
	public static int[]	res;		//用于存储结果
	public static boolean[] vis;	//用于记录该数在res中是否已排列
	public static int total;		
	public static int count = 0;
	
	public static void main(String[] args) {
		total = 10;
		res = new int[total];
		vis = new boolean[13];
		Arrays.fill(vis, true);	//未排列时为true
		dfs(0);
		System.out.println(count);
	}

	private static void dfs(int i) {
		if(i == total) {
			int s1 = res[0] + res[2] + res[5] + res[8];
			int s2 = res[0] + res[3] + res[7] + res[9];
			int s3 = res[1] + res[2] + res[3] + res[4];
			int s4 = res[1] + res[5] + res[6] + res[9];
			int s5 = res[8] + res[6] + res[7] + res[4];
			if(s1 == s2 && s2 == s3 && s3 == s4 && s4 == s5) {
				System.out.println(Arrays.toString(res));
				count++;
			}
		}
		
		for(int n = 1; n <= 12; n++) {
			if(n != 7 && n != 11 && vis[n]) {	//按题目要求,不为7与11,而且还未排列的
				res[i] = n;
				vis[n] = false;
				dfs(i+1);
				vis[n] = true;
			}
		}
	}
}

这里得出来的是所以结果,但题目要求镜像或者旋转视为同一种,对于五角星形状的,易得出其每种结果有五种旋转变式,又有五种镜像对称的变式,所以结果除以10

答案为12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值