蓝桥云客---九宫幻方

1.九宫幻方 - 蓝桥云课

九宫幻方

题目描述

小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3 * 3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。

三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。

492
357
816

有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。

而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序。

输入描述

输入仅包含单组测试数据。

每组测试数据为一个3 * 3的矩阵,其中为0的部分表示被小明抹去的部分。

给出的矩阵至少能还原出一组可行的三阶幻方。

输出描述

如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出"Too Many"(不包含引号)。

输入输出样例

​示例​

​输入​

0 7 2
0 5 0
0 3 0

​输出​

6 7 2
1 5 9
8 3 4

思路:

题目要求,只有一个解那么久输出这个解,如果多个解就输出too many。所以我们需要用一个数组储存第一个解。(题目说了输入数据会有解的)。

1.因为我们要填空,但是这个二维数组的填空有点麻烦,所以我们可以将每一个需要填空的位置记录在一个一维数组里面,这样就比较好爆搜了。

2.利用桶思维保证每一个数字只出现一次

3.check函数检查


代码如下:

#include <bits/stdc++.h>
using namespace std;struct Node{int x, y; }pos[10];//储存位置的数组 
int a[4][4], res[4][4];
bool used[10]; 
int cnt, ans;
bool check()
{for(int i = 1 ; i <= 3 ; i++)//判断行和列 {int s_row = a[i][1] + a[i][2] + a[i][3];int s_rank = a[1][i] + a[2][i] + a[3][i];if(s_row != 15 || s_rank != 15)return false;	}int s_pd = a[1][1] + a[2][2] + a[3][3];int s_nd = a[1][3] + a[2][2] + a[3][1];if(s_pd != 15 || s_nd != 15)return false;return true; 
}
void dfs(int step) 
{if (ans > 1) return; // 发现多解立即终止if (step > cnt) {if (check()) {ans++;if (ans == 1) // 仅保存第一个解{for(int i = 1 ; i <= 3 ; i++){for(int j = 1 ; j <= 3 ; j++){res[i][j] = a[i][j];				}		   	}	}}return;}int x = pos[step].x, y = pos[step].y;//取出坐标 for (int i = 1; i <= 9; i++) {if (!used[i]) {used[i] = true;a[x][y] = i;dfs(step + 1);used[i] = false;a[x][y] = 0; // 回溯}}
}
int main() 
{for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cin >> a[i][j];if (a[i][j] == 0) {++cnt;pos[cnt].x = i; // 从1开始记录待填位置pos[cnt].y = j;} else {used[a[i][j]] = true; // 标记已用数字}}}dfs(1);if (ans == 1) {for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cout << res[i][j] << " ";}cout << endl;}} else {cout << "Too Many";}return 0;
}

思路:

二维数组写法,直接模拟x,y负责填数字即可

代码:

#include <bits/stdc++.h>
using namespace std;struct Node{int x, y; }pos[10];//储存位置的数组 
int a[4][4], res[4][4];
bool used[10]; 
int cnt, ans;
bool check()
{for(int i = 1 ; i <= 3 ; i++)//判断行和列 {int s_row = a[i][1] + a[i][2] + a[i][3];int s_rank = a[1][i] + a[2][i] + a[3][i];if(s_row != 15 || s_rank != 15)return false;	}int s_pd = a[1][1] + a[2][2] + a[3][3];int s_nd = a[1][3] + a[2][2] + a[3][1];//对角线 if(s_pd != 15 || s_nd != 15)return false;return true; 
}
void dfs(int x,int y) 
{if (ans > 1) return; // 发现多解立即终止if(y > 3){x++;y = 1;}   if (x > 3) {if (check()) {ans++;if (ans == 1) // 仅保存第一个解{for(int i = 1 ; i <= 3 ; i++){for(int j = 1 ; j <= 3 ; j++){res[i][j] = a[i][j];				}		   	}	}}return;}if(a[x][y] == 0){for(int i = 1 ; i <= 9 ; i++){if (!used[i]) {used[i] = true;a[x][y] = i;dfs(x,y+1);used[i] = false;a[x][y] = 0; // 回溯}}}else{dfs(x,y+1);}}
int main() 
{for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cin >> a[i][j];if(a[i][j] > 0)used[a[i][j]] = true; }}dfs(1,1);if (ans == 1) {for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cout << res[i][j] << " ";}cout << endl;}} else {cout << "Too Many";}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)

1、先插好上电&#xff08;可正确识别&#xff09; 2、上电开机后插入USB 3.0 设备&#xff0c;报错如下&#xff0c;只能检测到USB2.0--480M&#xff0c;识别不到USB3.0-5Gbps&#xff0c;重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: re…

LiveData 和 MutableLiveData 的区别

LiveData 和 MutableLiveData 的区别 主要在于是否可以修改数据&#xff0c;但它们的工作原理基本相同。下面我们深入对比它们的行为、特性&#xff0c;以及它们在 ViewModel 和 UI 层中的使用方式。 1. LiveData 和 MutableLiveData 的基本区别 特性LiveDataMutableLiveData可…

SDK中窗口调用

存在窗口A和B的win32程序 , 当点击窗口A中的按钮后会弹出窗口B #include <windows.h>// 窗口 B 的窗口过程 LRESULT CALLBACK WindowProcB(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_DESTROY:PostQuitMessage(0);break;default:ret…

进行性核上性麻痹:饮食调理为健康护航

进行性核上性麻痹是一种复杂的神经退行性疾病&#xff0c;目前虽无法根治&#xff0c;但合理的健康饮食有助于缓解症状、提高患者生活质量。 高蛋白质食物在患者饮食中占据重要地位。鱼肉&#xff0c;尤其是富含 Omega-3 脂肪酸的三文鱼、鳕鱼等&#xff0c;不仅蛋白质含量丰富…

【Windows+Cursor】从0到1配置Arxiv MCP Server,实现论文自主查询、下载、分析、综述生成

1. 安装UV Installation | uv powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 将安装路径添加到环境变量 C:\Users\xxxxxx\.local\bin 2. git clone 代码 git clone https://github.com/blazickjp/arxiv-mcp-server.git…

WPF 教程:给 TreeView 添加 SelectedItem 双向绑定支持(MVVM-Friendly)

&#x1f332;WPF 教程&#xff1a;给 TreeView 添加 SelectedItem 双向绑定支持&#xff08;MVVM-Friendly&#xff09; 在 WPF 的 MVVM 应用中&#xff0c;TreeView 是非常常见的控件&#xff0c;但它有个“顽固”的缺陷&#xff1a; ❗它的 SelectedItem 不是依赖属性&…

Linux环境下内存错误问题排查与修复

最近这几天服务器总是掉线&#xff0c;要查一下服务器的问题。可以首先查看一下计算机硬件&#xff0c;这是一台某鱼上拼凑的服务器&#xff1a; sudo lshw -shortH/W path Device Class Description system NF5270M3 (To be filled by O…

函数和模式化——python

一、模块和包 将一段代码保存为应该扩展名为.py 的文件&#xff0c;该文件就是模块。Python中的模块分为三种&#xff0c;分别为&#xff1a;内置模块、第三方模块和自定义模块。 内置模块和第三方模块又称为库内置模块&#xff0c;有 python 解释器自带&#xff0c;不用单独安…

windows下载安装远程桌面工具RealVNC-Server教程(RealVNC_E4_6_1版带注册码)

文章目录 前言一、下载安装包二、安装步骤三、使用VNC-Viewer客户端远程连接&#xff0c;输入ip地址&#xff0c;密码完成连接 前言 在现代工作和生活中&#xff0c;远程控制软件为我们带来了极大的便利。RealVNC - Server 是一款功能强大的远程控制服务器软件&#xff0c;通过…

Android Dagger 2 框架的注解模块深入剖析 (一)

本人掘金号&#xff0c;欢迎点击关注&#xff1a;https://juejin.cn/user/4406498335701950 一、引言 在 Android 开发中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是一种强大的设计模式&#xff0c;它能够有效降低代码的耦合度&…

HTML语言的空值合并

HTML语言的空值合并 引言 在现代Web开发中&#xff0c;HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础语言。随着前端技术的快速发展&#xff0c;开发者们面临着大量不同的工具和技术&#xff0c;尤其是在数据处理和用户交互方面。空值合并是一些编程语言中常用…

【数据结构】树的介绍

目录 一、树1.1什么是树&#xff1f;1.2 树的概念与结构1.3树的相关术语1.4 树形结构实际运用场景 二、二叉树2.1 概念与结构2.2 特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 个人主页&#xff0c;点击这里~ 数据结构专栏&#xff0c;点击这里~ 一、树 1.1什么是树&#xff1…

Muduo网络库实现 [十三] - HttpRequest模块

目录 设计思路 成员设计 模块实现 设计思路 首先我们要先知道HTTP的请求的流程是什么样子的&#xff0c;不然我们会学的很迷糊。对于HTTP请求如何到来以及去往哪里&#xff0c;我们应该很清楚的知道 HTTP请求在服务器系统中的传递流程是一个多层次的过程: 客户端发起请求…

6. RabbitMQ 死信队列的详细操作编写

6. RabbitMQ 死信队列的详细操作编写 文章目录 6. RabbitMQ 死信队列的详细操作编写1. 死信的概念2. 消息 TTL 过期(触发死信队列)3. 队列超过队列的最大长度(触发死信队列)4. 消息被拒(触发死信队列)5. 最后&#xff1a; 1. 死信的概念 先从概念上解释上搞清楚这个定义&#…

如何使用Selenium进行自动化测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 对于很多刚入门的测试新手来说&#xff0c;大家都将自动化测试作为自己职业发展的一个主要阶段。可是&#xff0c;在成为一名合格的自动化测试工程师之前&#…

洛谷题单3-P5724 【深基4.习5】求极差 最大跨度值 最大值和最小值的差-python-流程图重构

题目描述 给出 n n n 和 n n n 个整数 a i a_i ai​&#xff0c;求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。 输入格式 第一行输入一个正整数 n n n&#xff0c;表示整数个数。 第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,…

STM32智能手表——任务线程部分

RTOS和LVGL我没学过&#xff0c;但是应该能硬啃这个项目例程 ├─Application/User/Tasks # 用于存放任务线程的函数 │ ├─user_TaskInit.c # 初始化任务 │ ├─user_HardwareInitTask.c # 硬件初始化任务 │ ├─user_RunModeTasks.c…

ubuntu22.04LTS设置中文输入法

打开搜狗网址直接下载软件&#xff0c;软件下载完成后&#xff0c;会弹出安装教程说明书。 网址:搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

php8 ?-> nullsafe 操作符 使用教程

简介 PHP 8 引入了 ?->&#xff08;Nullsafe 操作符&#xff09;&#xff0c;用于简化 null 检查&#xff0c;减少繁琐的 if 语句或 isset() 代码&#xff0c;提高可读性。 ?-> Nullsafe 操作符的作用 在 PHP 7 及以下&#xff0c;访问对象的属性或方法时&#xff0…