四阶幻方

把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时的所有方案数字,不要

填写任何多余内容或说明文字。

答案:416

import java.util.ArrayList;

public class Main {
public static boolean[] used = new boolean[17];
public static ArrayList<String> list = new ArrayList<String>();
public static int count = 0; public boolean check(int[] A, int step) {
if(step >= 4)
if(A[0] + A[1] + A[2] + A[3] != 34)
return false;
if(step >= 8)
if(A[4] + A[5] + A[6] + A[7] != 34)
return false;
if(step >= 12)
if(A[8] + A[9] + A[10] + A[11] != 34)
return false;
if(step >= 13)
if(A[0] + A[4] + A[8] + A[12] != 34 || A[3] + A[6] + A[9] + A[12] != 34)
return false;
if(step >= 14)
if(A[1] + A[5] + A[9] + A[13] != 34)
return false;
if(step >= 15)
if(A[2] + A[6] + A[10] + A[14] != 34)
return false;
if(step >= 16)
if(A[3] + A[7] + A[11] + A[15] != 34 || A[0] + A[5] + A[10] + A[15] != 34)
return false;
return true;
} public void dfs(int[] A, int step) {
if(check(A, step) == false)
return;
if(step == 16) {
StringBuffer s = new StringBuffer("");
for(int i = 0;i < A.length;i++)
s.append(A[i]);
if(!list.contains(s.toString())) {
list.add(s.toString());
count++;
}
return;
}
for(int i = 2;i <= 16;i++) {
if(used[i] == false) {
used[i] = true;
A[step] = i;
dfs(A, step + 1);
used[i] = false;
}
}
} public static void main(String[] args) {
Main test = new Main();
int[] A = new int[16];
A[0] = 1;
used[1] = true;
test.dfs(A, 1);
System.out.println(count);
}
}

最新文章

  1. Analyzer报表里显示的 * 星号、红叉、#井号的意义
  2. CSS中控制换行的四种属性
  3. 关于 java.util.concurrent 您不知道的 5 件事--转
  4. Web离线应用解决方案——ServiceWorker
  5. Activiti 6.0 之SkipExpression
  6. Redis实战 - 5事务:multi、exec和watch
  7. Window下搭建X5本地应用打包服务器
  8. 微信小程序wx.request接口
  9. git clone 后误删除了分离出来的文件怎么恢复?
  10. java之Stack详细介绍
  11. Sitecore CMS中的项目如何配置帮助文本
  12. openssl RSA加密方法初识
  13. 2018.10.12 bzoj4712: 洪水(树链剖分)
  14. Linux下驱动模块学习
  15. leetcode290
  16. FPGA时序约束一点总结
  17. (转) C#中Timer使用及解决重入(多线程同时调用callback函数)问题
  18. php概率算法
  19. thinkphp5一些文件夹用法
  20. 页面布局常用,让子级div排排坐

热门文章

  1. .NET Core接入ElasticSearch 7.5
  2. SpringBoot 整合Mail发送功能问题与解决
  3. 开始写博客的第一天,如何用c实现“hello wolrd”
  4. React组件setState
  5. Reids的面试题
  6. shipyard的安装与一般维护
  7. 第几天?(hdu2005)
  8. 不可不知的 7 个 JDK 命令
  9. Python的元类简单介绍
  10. MySQL/MariaDB随笔二