【解题报告+通法】_九宫幻方 蓝桥杯 2017年C组第八题(dfs解法)
题目描述
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
4 9 2
3 5 7
8 1 6有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~
输入格式:
输入仅包含单组测试数据。
每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。
输出格式:
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。
样例输入
0 7 2
0 5 0
0 3 0
样例输出
6 7 2
1 5 9
8 3 4
思路分析
几种分析思路
暴力法
一般采用多重循环或全排列来进行暴力枚举, 但暴力枚举的前提一般是已给限定条件后才能执行。 对本题来说,限定条件多变,实现复杂,放弃。
搜索法
常规的搜索模板即可。
代码展示
#include<bits/stdc++.h>
using namespace std;int a[15] = {0,1,2,3,4,5,6,7,8,9};
int b[15]; //保存最终答案
int vis[15];int num = 0; //num为边界条件
int sum = 0; //记录满足条件的矩阵个数void dfs(int step) {if(step == 9) { //连等只能用于赋值, 至于为什么,仔细想想原理 if( (a[3]+a[1]+a[2])==15 && (a[6]+a[4]+a[5])==15 && (a[9]+a[7]+a[8])==15 && (a[9]+a[3]+a[6])==15 && (a[2]+a[5]+a[8])==15 && (a[1]+a[4]+a[7])==15 && (a[1]+a[5]+a[9])==15 && (a[3]+a[5]+a[7])==15 ) {sum++;for(int i = 1; i <= 9; i++) b[i] = a[i];}}else for(int j = 1; j <= 9; j++) if(a[j] == 0) {for(int i = 1; i <= 9; i++) if(!vis[i]) {vis[i] = 1;a[j] = i;dfs(step+1);vis[i] = 0;a[j] = 0;}return;}
} int main() {for(int i = 1; i <= 9; i++) {int x; cin>>x;if(x != 0) { vis[x] = 1; a[i]=x; num++;} }dfs(num);if(sum == 1) for(int i = 1; i <= 9; i++) {cout << b[i] << ' ';if(i==3 || i==6 || i==9) cout << '\n';}else cout << "Too many" << '\n';
return 0; }
感想与总结
1、蓝桥杯的绝大多数题都是搜索或暴力,而近两年纯暴力的题越来越少,取而代之的是模拟+搜索或暴力+搜索。
2、本题就是一道非常标准的 模拟+搜索 类型题。 关于暴力+搜索,可参考2016年B组7题的剪邮票, 也很经典, 题目+题解,传送门
3、对于对称类型的题, 一定要考虑是否有重复的情况出现。
把手举过头顶,突然张开五指,那么,恭喜你给自己放了个烟花!
【解题报告+通法】_九宫幻方 蓝桥杯 2017年C组第八题(dfs解法)相关推荐
- 16行代码AC_蓝桥杯 2017年C组第三题 算式900(暴力解法+DFS解法)
励志用更少的代码做更高效的表达 题目描述: 小明的作业本上有道思考题: 看下面的算式: (□□□□-□□□□)*□□=900 其中的小方块代表0~9的数字,这10个方块刚好包含了0~9中的所有数字. ...
- 【已解决】蓝桥杯 2017年C组第五题 杨辉三角(分析与总结)
励志用少的代码做高效表达 题目描述: 杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要. 第0行: 1 第1行: 1 1 第2行: 1 2 1 第3行: 1 3 3 1 第4行: 1 4 6 ...
- 暴力优化解法+哈希解法——2016年第七届蓝桥杯省赛b组第八题 四平方和
Problem describe 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0 ...
- 复数幂用java程序怎么求_蓝桥杯——复数幂 (2018JavaAB组第3题)
18年Java蓝桥杯A组第3题和B组是一样的. 第三题往往比较难. 复数幂 (18JavaAB3) (A.B两卷第三题一样) 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. ...
- 蓝桥杯java组多少分能拿奖_记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结
引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...
- 2020年第11届蓝桥杯省赛Python组(真题+解析+代码):数字三角形
大家好,我是爱分享的小蓝,欢迎交流指正~ 1 真题 输入 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出 27 2 解析 难度系数:⭐⭐ 考察题型:动态规划 涉及知识点:模块 ...
- 【蓝桥杯练习】B组结果填空题13-18------更新中
[2013年B组] 2.标题: 马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了. 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ...
- 2018年第九届蓝桥杯国赛B组C++真题汇总
1. 换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. 小明有点强迫症,他坚持要求200元换 ...
- 21行代码AC_标题 Excel地址 2017年蓝桥杯真题(解题报告+通法)
励志用更少的代码做更高效的表达 题目描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如, A表示第1列, B表示第2列, Z表示第26列, AA表示第27列, AB表示第28列, B ...
最新文章
- oracle rodo 查看大小,Checkpoint not complete故障
- 神经网络的物理学解释(一)---权重与概率幅
- 你绝对能懂的“机器学习”(一)
- centos中bash占用cpu_Docker 多种维度限制容器可用的 CPU
- 八十七、CSS水平垂直居中的布局方式
- zabbix模板_基于zabbix网页配置自定义tomcat监控模板--监控项、触发器
- scala中的集合框架
- 【硬件工程师】元器件选型都不会?
- DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL过程
- 微信小程序无法获取头像,昵称的解决办法 (原生)
- html中鼠标点击效果的制作,用CSS实现鼠标单击特效-网页设计,HTML/CSS
- 游戏光枪坐标定位原理及算法
- 如何增加你微博的粉丝人数?微博推广20绝招
- OpenGL中关于矩阵缩放、平移、旋转的讲解
- Codeforces 718E.Matvey's Birthday dp+状态压缩
- 一步一步教你写股票走势图——K线图四(高亮联动一)
- 马斯克最新访谈全文,信息量极大,远见令人震撼
- 易通文件夹锁免费版 v4.5.8.06
- 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示
- mysql 1326_mssqlserver无法远程数据库Error: 1326错误解决方法