蓝桥杯 15决赛 A2 四阶幻方(剪枝)

蓝桥杯 15决赛 A2 四阶幻方(剪枝)

标题:四阶幻方
把1~16的数字填入4x4的方格中,使得行、列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方。
四阶幻方可能有很多方案。如果固定左上角为1,请计算一共有多少种方案。
比如:
1 2 15 16
12 14 3 5
13 7 10 4
8 11 6 9
以及:
1 12 13 8
2 14 7 11
15 3 10 6
16 5 4 9
就可以算为两种不同的方案。
请提交左上角固定为1时的所有方案数字,不要填写任何多余内容或说明文字。

======================================

思路:
dfs
剪枝(这题剪枝真的很重要,快很多)

/*
 @author weng
 @build  2020年7月21日 上午10:48:30
*/

public class 剪枝_幻方_2 {
	static boolean[] b=new boolean[17];
	static int[] a =new int[16];
	static int ans;
	public static void main(String[] args) {
		a[0] =1;
		dfs(1);
		System.out.println(ans);
	}
	private static void dfs(int lev) {
		if(lev ==16) {
			ans ++;
			return ;
		}
		for(int i =2 ;i <=16 ;i ++) {
			if(b[i]) continue;
			a[lev] =i;
			//剪枝
			if((lev +1) %4 ==0) {
				if(34 !=a[lev] +a[lev -1] +a[lev -2] +a[lev -3]) continue;
			}
			if(lev >11) {
				if(34 !=a[lev] +a[lev -4] +a[lev -8] +a[lev -12]) continue;
			}
			if(lev ==12) {
				if(a[3] +a[6] +a[9] +a[12] !=34) continue ;
			}
			if(lev ==15) {
				if(a[0] +a[5] +a[10] +a[15] !=34) continue ;
			}
			b[i] =true;
			dfs(lev +1);
			b[i] =false;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肯尼思布赖恩埃德蒙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值