第六届蓝桥杯总决赛 四阶幻方



题目:四阶幻方


把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时的所有方案数字,不要填写任何多余内容或说明文字。

分析:简单的回溯问题,16*16,规模有点大,剪枝时条件需要严谨一点,逐步排除不满足条件的情况,以提高运算效率。我是这样想的,16个格子,有几个格子处是可以判断的:填充到第8个格子时,判断前面两行;填充到第12个格子时,前面两行肯定满足条件了,此时判断第三行和前面任一行;填充到第13个格子时,前面三行已经满足,此时再判断下第一列和一个对角线;填充到14、15个格子时判断下列;填充到最后一个格子时,判断下最后一列、最后一行以及另一条对角线。

代码如下:

package 第六届决赛;

public class 四阶幻方 {
	private static int count=0;
	public static void main(String args[]){
		int a[]=new int[16];
		a[0]=1;
		for(int i=1;i<16;i++)
			a[i]=0;//初始化
		fun(a,1);
		System.out.print(count);
	}
	public static void fun(int a[],int n){
		//填充第n个格子
		if(n==16){
			count++;
		}else{
			for(int i=2;i<=16;i++){
				a[n]=i;
				if(check(a,n))
					fun(a,n+1);
			}
		}
	}
	public static boolean check(int a[],int n){
		boolean f=true;
		for(int i=0;i

答案是416

你可能感兴趣的:(Java蓝桥杯)