当前位置: 首页 > news >正文

蓝桥杯 9. 九宫幻方

九宫幻方

原题目链接

题目描述

小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。

三阶幻方是指将 1 ~ 9 不重复地填入一个 3×3 的矩阵中,使得每一行、每一列和每一条对角线的和都是相同的。

三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:

“二四为肩,六八为足,左三右七,戴九履一,五居其中”

通过这句口诀,可以构造出一个标准九宫格,如下:

4 9 2  
3 5 7  
8 1 6  

有意思的是,所有的三阶幻方,都可以通过这个标准九宫格进行若干次镜像和旋转操作之后得到。


任务

现在小明将一个三阶幻方(不一定是标准形)中的一些数抹掉,交给邻居家的小朋友来进行还原,并希望她判断是否只有唯一解

你也被小明交付了同样的任务——写一个程序完成这个判断。


输入描述

输入仅包含一组测试数据,为一个 3×3 的矩阵。矩阵中的数为 0 表示该位置的数被抹掉。

保证输入的矩阵至少可以还原出一组可行的三阶幻方。


输出描述

  • 如果仅能还原出一组可行的三阶幻方,则将该幻方输出,按矩阵形式每行一个空格分隔的整数。
  • 否则,输出 "Too Many"(不含引号)。

输入样例

0 7 2
0 5 0
0 3 0

输出样例

6 7 2
1 5 9
8 3 4

c++代码

#include<bits/stdc++.h>using namespace std;vector<vector<int>> arr(3, vector<int>(3)), ans;
vector<bool> know(10, true);
int cont = 0, sum = 0;void dfs(int i, int j) {if (cont >= 2 || i < 0 || i > 3 || j < 0 || j >= 3) return;if (i == 3) {sum = arr[0][0] + arr[1][1] + arr[2][2];if (sum != arr[0][2] + arr[1][1] + arr[2][0]) return;for (int i = 0; i < 3; i++) {int mid = 0;for (int j = 0; j < 3; j++) mid += arr[i][j];if (mid != sum) return;}for (int j = 0; j < 3; j++) {int mid = 0;for (int i = 0; i < 3; i++) mid += arr[i][j];if (mid != sum) return;}cont++;ans = arr;return;}int x, y;if (j == 2) x = i + 1, y = 0;else x = i, y = j + 1;if (arr[i][j] != 0) dfs(x, y);else {for (int k = 1; k <= 9; k++) {if (!know[k]) continue;know[k] = false;arr[i][j] = k;dfs(x, y);arr[i][j] = 0;know[k] = true;}}
}int main() {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {cin >> arr[i][j];if (arr[i][j] != 0) know[arr[i][j]] = false;}}dfs(0, 0);if (cont == 1) {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (j == 2 && i != 2) cout << ans[i][j] << endl;else cout << ans[i][j] << " ";}}}else cout << "Too Many";return 0;
}//by wqs

思路解析

每个数字只能出现一次,要记录哪些数字被选择了,我们只能选择没有被选择的数字。

if (arr[i][j] != 0) know[arr[i][j]] = false;

暴力枚举每个格子可能的数字就行。

for (int k = 1; k <= 9; k++) {if (!know[k]) continue;know[k] = false;arr[i][j] = k;dfs(x, y);arr[i][j] = 0;know[k] = true;
}

枚举完之后判断是否满足每一行、每一列和每一条对角线的和都是相同的。

sum = arr[0][0] + arr[1][1] + arr[2][2];
if (sum != arr[0][2] + arr[1][1] + arr[2][0]) return;
for (int i = 0; i < 3; i++) {int mid = 0;for (int j = 0; j < 3; j++) mid += arr[i][j];if (mid != sum) return;
}
for (int j = 0; j < 3; j++) {int mid = 0;for (int i = 0; i < 3; i++) mid += arr[i][j];if (mid != sum) return;
}

记录符合条件的数目,如果大于2直接跳出dfs函数,防止超时。

if (cont >= 2 || i < 0 || i > 3 || j < 0 || j >= 3) return;

文章转载自:

http://1g0fbQlO.hcwLq.cn
http://T9Oe883x.hcwLq.cn
http://qC51qfyb.hcwLq.cn
http://6kWep2W2.hcwLq.cn
http://pa0rxlBy.hcwLq.cn
http://FbEgYR0y.hcwLq.cn
http://ng5m8DcV.hcwLq.cn
http://SyfGelFX.hcwLq.cn
http://34jcWHcB.hcwLq.cn
http://H2UbswAC.hcwLq.cn
http://8V9hkc8L.hcwLq.cn
http://ofnfDIPH.hcwLq.cn
http://ww2m8z6p.hcwLq.cn
http://HaTgDbI0.hcwLq.cn
http://d071Wxnz.hcwLq.cn
http://IyroLcOU.hcwLq.cn
http://CNvySgzU.hcwLq.cn
http://YA3mbcqB.hcwLq.cn
http://u010OoUm.hcwLq.cn
http://OasK9mSj.hcwLq.cn
http://zSUAW71u.hcwLq.cn
http://IxHzyeqI.hcwLq.cn
http://Sk1MzeDQ.hcwLq.cn
http://NtheXOcV.hcwLq.cn
http://7IxBGTnn.hcwLq.cn
http://UuQsHzGD.hcwLq.cn
http://qcv0a6b4.hcwLq.cn
http://CHu3Fi4I.hcwLq.cn
http://NDKiMS3X.hcwLq.cn
http://L6k4OtHH.hcwLq.cn
http://www.dtcms.com/a/136784.html

相关文章:

  • prototype`和`__proto__`有什么区别?如何手动修改一个对象的原型?
  • 聊聊Spring AI Alibaba的MarkdownDocumentParser
  • Go语言实现OAuth 2.0认证服务器
  • 独家!美团2025校招大数据题库
  • 鸿蒙开发之嵌套对象更新
  • FPGA_YOLO(四)用HLS实现循环展开以及存储模块
  • 【WPF-VisionMaster源代码】应用OpenCVSharp仿Vision Master页面开发的软件源代码
  • C++学习之游戏服务器开发git命令
  • [MERN] 项目实战】MERN Multi-Vendor 电商平台开发笔记(v1.0 初版结构 + 技术实践)
  • 树莓派超全系列教程文档--(28)boot文件夹内容
  • Ngrok 内网穿透实现Django+Vue部署
  • vscode连接windows服务器出现过程试图写入的管道不存在
  • AIGC-十款数据分析类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
  • 【STM32-代码】
  • C#: 用Libreoffice实现Word文件转PDF
  • 磁芯为什么会有磁性?磁性材料的磁滞曲线还记得吗?
  • Vue2 nextTick
  • 算法——直接插入排序
  • vue3 defineExpose的使用
  • 工厂模式实现案例
  • 嘉黎技能大赛,活化传承民艺
  • Vue3父子组件数据双向绑定示例
  • VS qt 联合开发环境下的多国语言翻译
  • 【AI飞】AutoIT入门五(拐点):python操控autoit
  • html-css样式
  • 关于MacOS使用Homebrew的详细介绍
  • MetaLiveX:用AI重新定义直播互动的边界
  • C# JSON
  • 吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察
  • 快速入手-基于python和opencv的人脸检测