欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

[蓝桥杯2016决赛]反幻方-next_permutation枚举

发布时间:2023/12/4 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [蓝桥杯2016决赛]反幻方-next_permutation枚举 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目描述
我国古籍很早就记载着
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; }

总结

以上是生活随笔为你收集整理的[蓝桥杯2016决赛]反幻方-next_permutation枚举的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。