题目描述
我国古籍很早就记载着
2 9 4
7 5 3
6 1 8
这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。
下面考虑一个相反的问题。
可不可以用 1~9 的数字填入九宫格,使得:每行每列每个对角线上的数字和都互不相等呢?
这应该能做到。
比如:
9 1 2
8 4 3
7 5 6
你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。旋转或镜像算同一种。
比如:
9 1 2 7 8 9 2 1 9
8 4 3 5 4 1 3 4 8
7 5 6 6 3 2 6 5 7
输出
输出一个整数表示答案
解题思路:
旋转/4,镜像/2,所以/8
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};bool check() {int r1 = a[0] + a[1] + a[2];int r2 = a[3] + a[4] + a[5];int r3 = a[6] + a[7] + a[8];int r4 = a[0] + a[3] + a[6];int r5 = a[1] + a[4] + a[7];int r6 = a[2] + a[5] + a[8];int r7 = a[0] + a[4] + a[8];int r8 = a[2] + a[4] + a[6];if (r1 != r2 && r1 != r3 && r1 != r4 && r1 != r5 && r1 != r6 && r1 != r7 && r1 != r8 &&r2 != r3 && r2 != r4 && r2 != r5 && r2 != r6 && r2 != r7 && r2 != r8 &&r3 != r4 && r3 != r5 && r3 != r6 && r3 != r7 && r3 != r8 &&r4 != r5 && r4 != r6 && r4 != r7 && r4 != r8 &&r5 != r6 && r5 != r7 && r5 != r8 &&r6 != r7 && r6 != r8 && r7 != r8) {return true;} elsereturn false;
}
int ans;int main() {do {if (check())ans++;} while (next_permutation(a, a + 9));cout << ans / 8 << endl;return 0;
}