测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40868. 四阶幻方

填空题 困难

题目描述

四阶幻方

题目描述

把 1 ~ 16 的数字填入 4 x 4 的方格中,使得行、列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方。

四阶幻方可能有很多方案,如果固定左上角为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 时的所有方案数字,不要填写任何多余内容或说明文字。

参考答案

#include <iostream> using namespace std; const int N = 20; int a[N], tmp, ans; bool st[N]; void dfs(int u) { if(u == 3) tmp = 1 + a[0] + a[1] + a[2]; // 四行 if(u == 7 && tmp != a[3] + a[4] + a[5] + a[6]) return; if(u == 11 && tmp != a[7] + a[8] + a[9] + a[10]) return; if(u == 15 && tmp != a[11] + a[12] + a[13] + a[14]) return; if(u == 12 && tmp != 1 + a[3] + a[7] + a[11]) return; // 四列 if(u == 13 && tmp != a[0] + a[4] + a[8] + a[12]) return; if(u == 14 && tmp != a[1] + a[5] + a[9] + a[13]) return; if(u == 15 && tmp != a[2] + a[6] + a[10] + a[14]) return; if(u == 15 && tmp != 1 + a[4] + a[9] + a[14]) return; // 两条对角线 if(u == 12 && tmp != a[2] + a[5] + a[8] + a[11]) return; if(u == 15) ans ++; for (int i = 2; i <= 16; i ++) { if(!st[i]) { a[u] = i; st[i] = true; dfs(u + 1); st[i] = false; } } } int main() { dfs(0); cout << ans << endl; return 0; }

答案解析

答案:416

上一题 下一题