题目描述
把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时的所有方案数字

刚开始,以为又是水题,然后…原来15个数的全排列这么大,next_permutation的做法不行!!!
代码如下:

#include <iostream>
#include <algorithm>
using namespace std;
int b = 1;
int a[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
int ans;bool check() {int r1 = b + a[1] + a[2] + a[3];int r2 = a[4] + a[5] + a[6] + a[7];int r3 = a[8] + a[9] + a[10] + a[11];int r4 = a[12] + a[13] + a[14] + a[15];int r5 = b + a[5] + a[10] + a[15];int r6 = a[3] + a[6] + a[9] + a[12];if (r1 == r2 && r1 == r3 && r1 == r4 && r1 == r5 && r1 == r6 &&r2 == r3 && r2 == r4 && r2 == r5 && r2 == r6 &&r3 == r4 && r3 == r5 && r3 == r6 && r4 == r5 && r4 == r6 &&r5 == r6 ) {return true;}return false;
}int main() {do {if (check()) {ans++;}} while (next_permutation(a, a + 15));cout << ans << endl;return 0;
}

所以我们只能用dfs了,还需要剪枝不然会超时。

解题思路:
事实上,n阶幻方,都有其各自的固定值(每行相加或者每列相加或者某一条对角线相加的和),4阶幻方的和为34,故我们可以这样剪枝,当最开始的这一行填满后,每次填满一行后判断上一行每个数相加是否等于34,然后,在接下来的check环节,也可以判断某一行,某一列看是不是等于34,不是就return false

代码如下:

#include <iostream>
using namespace std;
const int res = 34;
const int N = 20;
int a[N][N];
int ans;
bool st[N];bool check_row(int n) {//判断行int sum = 0;for (int i = 0; i <= 3; i++) {sum += a[n][i];}return sum != res;
}bool check() {int sum = 0;sum += a[0][0] + a[1][1] + a[2][2] + a[3][3];//对角线if (sum != res)return false;sum = 0;sum += a[0][3] + a[1][2] + a[2][1] + a[3][0];//对角线if (sum != res)return false;for (int i = 0; i <= 3; i++) {//行if (check_row(i))return false;}for (int i = 0; i <= 3; i++) {//列int sum = 0;sum += a[0][i] + a[1][i] + a[2][i] + a[3][i];if (sum != res)return false;}return true;
}void dfs(int u) {if (u == 16) {if (check()) {ans++;}return ;}if (u % 4 == 0) {//剪枝,判断上一行是是否等于34if (check_row(u / 4 - 1))return ;}for (int i = 2; i <= 16; i++) {if (!st[i]) {st[i] = true;a[u / 4][u % 4] = i;dfs(u + 1);st[i] = false;}}}int main() {a[0][0] = 1;dfs(1);cout << ans << endl;return 0;
}

[蓝桥杯2015决赛]四阶幻方相关推荐

  1. 1265: [蓝桥杯2015决赛]四阶幻方

    题目链接:1265: [蓝桥杯2015决赛]四阶幻方 题目描述 把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. 四阶幻方可能有很多方案.如果固 ...

  2. 1265: [蓝桥杯2015决赛]四阶幻方 C/C++

    题目描述: 把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1,请计算一共有多少种方案. 比如: 1  ...

  3. 【蓝桥杯】2015决赛 四阶幻方

    题目描述 把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1,请计算一共有多少种方案. 比如: 1 2 ...

  4. 蓝桥杯2015决赛-方格填数-枚举 or dfs

    题目描述 在2行5列的格子中填入1到10的数字. 要求:相邻的格子中的数,右边的大于左边的,下边的大于上边的. 如下图所示的2种,就是合格的填法. 请你计算一共有多少种可能的方案. 输出 请输出该整数 ...

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

    题目描述 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方.每行每列以及对角线上的数字相加都相等. 下面考虑一个相反的问题. 可不可以用 1~9 的数字填入九宫格,使得:每行 ...

  6. [蓝桥杯2015决赛]奇怪的数列-双指针+模拟

    题目描述 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 - YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行&q ...

  7. [蓝桥杯2015决赛]机器人数目-枚举

    题目描述 少年宫新近邮购了小机器人配件,共有3类,其中, A类含有:8个轮子,1个传感器 B类含有: 6个轮子,3个传感器 C类含有:4个轮子,4个传感器 他们一共订购了100套机器人,收到了轮子60 ...

  8. [蓝桥杯2015决赛]分机号-枚举(水题)

    题目描述 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位. 比如:751,520,321 都满足要求,而766,918,201 就不符合要求. 现 ...

  9. [蓝桥杯2015决赛]积分之迷-枚举(水题)

    题目描述 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:315 第二笔 ...

最新文章

  1. private 的访问权限
  2. OTP gen_server
  3. 已知gcd和lcm求a+b最小和?------数论
  4. feign一个接口多个方法_spring cloud 建一个服务消费者client-feign(最好用这种方式)...
  5. ISO语言代码和国家代码+Locale常量+ISO货币符号
  6. [小技巧][JAVA]函数返回一个长度不确定的数组 (int[ ])
  7. 听说你想爬点壁(mei)纸图
  8. k8s redis集群_容器:K8S核心组件介绍
  9. react 使用rewired_create-react-app 通过 react-app-rewired 添加 webpack 的 alias
  10. c语言贪吃蛇游戏 vc6,把tc下的贪吃蛇游戏改到vc6下运行
  11. 如何修改docker swarm节点的hostname
  12. 希尔伯特变换与SSB调制
  13. redirect_uri域名与后台配置不一致
  14. 电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF
  15. 计算机学院软件设计比赛作品,计算机学院成功举办首届软件设计大赛
  16. Flutter 布局之企鹅电竞
  17. linux重新mac,用 Linux 让旧 MacBook 重获新生
  18. android商品尺码界面,多终端产品 | 解析原型画布尺寸和界面尺寸
  19. [C语言]实现字符串从头尾分别输出字符的动画效果
  20. 【opencv 450 Image Processing】Periodic Noise Removing Filter周期性去噪滤波器

热门文章

  1. 人工智能AI课 个性化推荐系统详解
  2. 苹果电脑打开任何来源
  3. 嵌入式单元测试工具Tessy的一些测试技巧
  4. js判断某个变量是否等于undefined
  5. Java小白入门——学习感受随笔
  6. filesystem
  7. 分布式机器学习(上)-并行计算与机器学习
  8. IPv4的私有IP地址和IPv6的私有IP地址 分享
  9. html div点击选中效果,纯css实现选中切换效果
  10. python在线运行-在线 Python运行工具