蓝桥杯国赛之四阶幻方
题目:四阶幻方
把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时的所有方案数字,不要填写任何多余内容或说明文字。
答案:
public class Main
{static int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };static int count = 0;
// 穷举法+DFSpublic static void main(String[] args){dfs(1);System.out.println(count);}
// 因为dfs()的结构为先判断,再操作,再进入下一层,再还原。
// 所以当k == 1时,操作了第一个位置,当 k== 2时,才能判断2个元素。
// 要判断16个元素,就要 k == 16,也就是arr.length。public static void dfs(int k){
// 当 k == arr[]的长度的时候,就意味着16个数字都填好了。if (k == arr.length){
// 最后一行 && 最后一列if (arr[12] + arr[13] + arr[14] + arr[15] == 34 && arr[15] + arr[11] + arr[7] + arr[3] == 34)// 判断最后一行
// 右对角线线 && 左对角线 是否等于34if (arr[12] + arr[9] + arr[6] + arr[3] == 34 && arr[0] + arr[5] + arr[10] + arr[15] == 34)// 之后判断 每列count++;return;}
// k / 4 != 0 && k % 4 == 0 这样的条件就可以限定 k 为4的倍数
// 这里有一个思想:当有5个元素的时候(我放了4个),我就比较0/1/2/3这四个;当有9个元素的时候(我放了8个),我就比较 4/5/6/7这四个。
// 这个if语句是用来判断每一行的,在DFS的时候,一边深入一边检测每一行。if (k / 4 != 0 && k % 4 == 0) {// 每次改变顺序够4个 就判断是否等于34int n = k / 4;if (arr[n * 4 - 4] + arr[n * 4 - 3] + arr[n * 4 - 2] + arr[n * 4 - 1] != 34)return;}
// (k - 1) / 4 == 3 用这样的条件,就能捕捉到 13/14/15/16 这几个数字
// 这个if语句是用来判断每一列的,在DFS的时候,一边深入一边比较每一列。if ((k - 1) / 4 == 3){// 判断每列是否符合 因为到第四行的时候才能判断列 当到达第四行第一个时还没进行交换 所以当遍历到第二个时// 再判断他前面的位置是否到了第四行,然后每个位置除四的余数正好是它所在第几个的位置int n = (k - 1) % 4;if (arr[0 + n] + arr[4 + n] + arr[8 + n] + arr[12 + n] != 34)return;}for (int i = k; i < arr.length; i++){
// 把arr[k]与arr[i]的值互换int t = arr[k];arr[k] = arr[i];arr[i] = t;
// dfs(k + 1);
// 把arr[i]与arr[k]的值互换t = arr[k];arr[k] = arr[i];arr[i] = t;}}
}
蓝桥杯国赛之四阶幻方相关推荐
- 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)
[写在前面的话19.04.04] 今年省赛的结果出的意外得快,有很多小伙伴来和我分享他们进了省一的喜悦,并问我啥时候更新国赛题解,emmm--不是我不想更新,实在是抽不出时间,有缘再更--虽然不更新题 ...
- 蓝桥杯国赛 C/C++ ABC组题解(第四届 ~ 第十二届)
2020年第十一届蓝桥杯国赛 题号 类型 C++ A组 C++ B组 C++ C组 试题A 结果填空 合数个数 美丽的 2 美丽的 2 试题B 结果填空 含 2 天数 (日期处理) 扩散 (BFS) ...
- 蓝桥杯国赛知识点汇总
蓝桥杯国赛备赛总结知识点,以老师给的为原型,添加自己理解,供大家参考,后期不定时更新. 基础 1.熟练掌握API1.8常用方法 2.大数(高精度)加减乘除 3.并查集 模板: public class ...
- 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑
题目链接 Ideas 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑 Code Python if __name__ == '__main__':n = int(input( ...
- 2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数
2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数 在线评测 Ideas 对于一个纯循环小数,假设循环节为l,则小数为0.llll-,转换为分数就是 l / (10 ** n ...
- 蓝桥杯评分标准_新闻 | 人工智能学院创新创业实践中心开展蓝桥杯国赛经验分享会...
为让各位蓝桥杯国赛选手以饱满精力迎接接下来的比赛,天津科技大学人工智能学院创新创业实践中心邀请到计算机科学与技术专业教研室主任吴江红老师为各位蓝桥杯国赛选手分享经验,提高选手们的应试应赛能力. 吴江红 ...
- 第十一届蓝桥杯国赛题目
以下是第十一届蓝桥杯国赛题目,供大家学习参考(提取码失效可以评论我) 百度云: 链接: https://pan.baidu.com/s/1g1o-px-RUVoXLLhRDS8cXQ 提取码: fgf ...
- 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解 更新:成绩出来了,估分50分左右,最后拿了个国二,还差点到国一,有点出乎意料,挺满意了挺满意了. 去年国赛基本都是暴力,最后国三都没拿到(我是 ...
- 第十二届蓝桥杯国赛真题+题解 Python
文章目录 写在前面 试题A:带宽 试题 B: 纯质数 试题C: 完全日期 试题D: 最小权值 试题 E: 大写 试题 F: 123 试题 G: 冰山 试题 H: 和与乘积 试题 I: 二进制问题 试题 ...
最新文章
- Android Jetpack组件之 Paging使用-源码
- linux 字符串转换函数 simple_strtoul 简介
- HDU4473_Exam
- java notify唤醒原理_Java wait和notify虚假唤醒原理
- JSON中的JSON.parseArray()、JSON.parseObject()、JSON.tojsonString()
- java自定义注解实现日志功能
- ASP.Net数据库如何存取图片
- SQL 2008 R2 收缩日志,不用修改简单模式
- css3在线快速制作工具
- Linux在出现/java: cannot execute binary file
- snprintf实现_高斯模糊的GLSL实现
- pagehelper中找不到pageinterceptor这个类_PageHelper分页插件
- getData 函数
- 安装SQL Server 2012 RTM遇到 Microsoft NET Framework 4 0 install
- 超详细的AI深度学习“花书”笔记(附中英文电子书资料)
- arm架构与体系结构
- 金属重量计算机在线,金属重量计算器
- java中的POJO类
- 「音视频直播技术」Android下H264解码
- Opencv 统计灰度图所有灰度值