【蓝桥杯基础题】2017年省赛—九宫幻方

news2024/11/18 15:30:48

在这里插入图片描述

  • 👑专栏内容:👉蓝桥杯刷题👈
  • ⛪个人主页:👉子夜的星的主页👈
  • 💕座右铭:前路未远,步履不停

目录

  • 一、题目背景
  • 二、题目描述
    • 1.问题描述
    • 2.输入格式
    • 3.输出格式
    • 4.一个例子
  • 三、题目分析
    • 1. 执果索因
    • 2. 全排列
    • 3. 深度优先搜索(DFS)
  • 四、代码汇总
    • 1. 执果索因
    • 2. 全排列
    • 3. DFS
  • 五、总结
    • 1. 全排列
    • 2. 九宫幻方的判断
    • 3. 深度优先搜索


一、题目背景

本题为2020年省赛程序设计题

  • C/C++ C 组第8题

二、题目描述

1.问题描述

小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3 x 3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。

4 9 2
3 5 7
8 1 6

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

2.输入格式

输入仅包含单组测试数据。
每组测试数据为一个3 x 3的矩阵,其中为0的部分表示被小明抹去的部分。
对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。

3.输出格式

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

4.一个例子

下面是一个样例
输入:
0 7 2
0 5 0
0 3 0

输出:

6 7 2
1 5 9
8 3 4

三、题目分析

1. 执果索因

通过使用科技的力量或者自己独立思考,提前找出三阶幻方的所有可能解。
再将自己已经知道的所有解提前放入程序里面,与输入的数进行比对。
如果只能比对出一组可行的幻方,则将其输出。
科技力量直通车→科技创造美好生活
在这里插入图片描述

2. 全排列

上面的方法是将已知答案放入程序中,但是更多的情况,我们是不知道答案的。

对此,我们只能将所有可能都弄出来。

这里就需要利用数学中的排列知识了。

排列,一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(permutation)。特别地,当m=n时,这个排列被称作全排列(all permutation)。

C++algorithm中提供了内置的全排列函数next_permutation

下面介绍一下next_permutation函数

在这里插入图片描述

使用方法:next_permutation(数组头地址,数组尾地址);

若下一个排列存在,则返回真,如果不存在则返回假

举个例子:

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int b[3] = { 1,2,3 };
	do
	{
		for (int i = 0; i < 3; ++i)
			cout << b[i] ;
		cout << endl;
	} while (next_permutation(b, b + 3));
	return 0;
}

在这里插入图片描述

利用循环,和next_permutation的返回值,巧妙的得到全排列结果。
然后利用九宫幻方的性质,检查是不是九宫幻方。

九宫幻方:每一行、每一列、每一对角线的和都相同。

3. 深度优先搜索(DFS)

注意:完全不知道DFS是什么的可以看下这篇博客:深度优先搜索(DFS)

在这里插入图片描述

四、代码汇总

1. 执果索因

#include <iostream>
#include<string>
#include <algorithm>
using namespace std;
int main()
{
	int a[3][3], f = 0, k = 0, i, j;
	//初始化
	string b = "000000000";
	//所有可能的答案
	string vis[8] = { "816357492","618753294","492357816","294753618","672159834","834159672","276951438","438951276" };
	int v[8] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cin >> a[i][j];
			//将int转为string
			b[k++] = a[i][j] + '0';
		}
	}
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 9; j++)
		{
			if (b[j] != '0')
			{
				//比较下一个字符串
				if (vis[i][j] != b[j])
					break;
			}
		}
		if (j == 9)
		{
			f++;
			v[i] = 1;
		}
		if (f > 1)
		{
			cout << "Too Many" << endl;
			break;
		}
	}
	k = 0;
	if (f == 1)
	{
		for (i = 0; i < 9; i++)
			if (v[i] == 1)break;
		while (k < 9)
		{
			cout << vis[i][k++] << " ";
			if (k % 3 == 0)cout << endl;
		}
	}
	return 0;
}

2. 全排列

#include <iostream>
#include<string>
#include <algorithm>
using namespace std;
int arr[9];
int str[9] = { 1,2,3,4,5,6,7,8,9 };

bool flag = true;
int ans = 0;
//检查是不是九宫幻方
bool check(int a[])
{
	int a1 = a[0] + a[1] + a[2];
	int a2 = a[3] + a[4] + a[5];
	int a3 = a[6] + a[7] + a[8];
	int a4 = a[0] + a[3] + a[6];
	int a5 = a[1] + a[4] + a[7];
	int a6 = a[2] + a[5] + a[8];
	int a7 = a[2] + a[4] + a[6];
	int a8 = a[0] + a[4] + a[8];
	if (a1 == a2 && a2 == a3 && a3 == a4 && a4 == a5 && a5 == a6 && a6 == a7 && a7 == a8)
		return true;
	return false;
}

int main() 
{
	for (int i = 0; i < 9; i++)
		cin >> arr[i];
	do {
		if (check(str))
		{
			flag = true;
			for (int i = 0; i < 9; i++)
			{
				if (arr[i] != 0 && arr[i] != str[i])
				{
					flag = false;
				}
			}

			if (flag)
			{
				for (int i = 0; i < 9; i++)
					arr[i] = str[i];
				ans++;
			}
		}
	} while (next_permutation(str, str + 9));

	if (ans == 1)
	{
		int k = 0;
		for (int i = 0; i < 3; i++)
		{
			for (int j = 0; j < 3; j++)
			{
				cout << arr[k] << " ";
				k++;
			}
			cout << endl;
		}
	}
	else if (ans > 1)
		cout << "Too Many" << endl;
	return 0;
}

3. DFS

#include <iostream>
#include<string>
#include <algorithm>
int a[5][5];
int b[5][5];
int vis[15];
int ans = 0;
using namespace std;
bool check()
{
	int sum1, sum2;
	int x = a[1][1] + a[1][2] + a[1][3];
	for (int i = 1; i <= 3; i++)
	{
		sum1 = 0, sum2 = 0;
		for (int j = 1; j <= 3; j++)
		{
			sum1 += a[i][j];
			sum2 += a[j][i];
		}
		if (sum1 != x || sum2 != x)
			return 0;
	}
	sum1 = a[1][1] + a[2][2] + a[3][3];
	sum2 = a[1][3] + a[2][2] + a[3][1];
	if (sum1 != x || sum2 != x)
		return false;
	return true;
}
void dfs(int num)
{
	if (num == 9)
	{
		if (check())
		{
			for (int i = 1; i <= 3; i++)
				for (int j = 1; j <= 3; j++)
					b[i][j] = a[i][j];
			ans++;
		}
		return;         
	}
	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
		{
			if (a[i][j] == 0)
			{
				for (int k = 1; k <= 9; k++)
				{
					if (!vis[k])
					{
						vis[k] = 1;
						a[i][j] = k;
						dfs(num + 1);
						vis[k] = 0;
						a[i][j] = 0;
					}
				}
				return;
			}
		}
}
int main()
{
	int num = 0;
	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
		{
			cin >> a[i][j];
			vis[a[i][j]] = 1;
			if (a[i][j] != 0)
				num++;
		}
	dfs(num);
	if (ans == 1)
		for (int i = 1; i <= 3; i++)
		{
			for (int j = 1; j <= 3; j++)
				cout << b[i][j] << " ";
			cout << endl;
		}
	else
		cout << "Too Many" << endl;
	return 0;
}

五、总结

1. 全排列

排列、全排列的计算。

全排列函数:next_permutation 的用法。

2. 九宫幻方的判断

九宫幻方:每一行、每一列、每一对角线的和都相同。

3. 深度优先搜索

深度优先搜索(DFS)

📢📢📢📢📢📢
💗 你正在阅读 【子夜的星】 的蓝桥杯学习笔记
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中帮我指正吧

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

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

相关文章

CAN通信----(创芯科技)CAN分析仪使用----CANTest安装和驱动安装

前言 我在调试CAN通信时&#xff0c;使用的是在淘宝买的CAN分析仪。 CAN分析仪的实物如下&#xff1a; 使用CAN分析仪&#xff0c;调试CAN通信&#xff0c;PC电脑端需要使用CANTest测试软件&#xff0c;还需要安装驱动。 一、创芯科技 CAN分析仪资料包下载 步骤1&#xff1…

测开-基础篇

一、软件测试的生命周期 先来回顾软件的生命周期 &#x1f351;软件的生命周期 需求分析--》计划--》设计--》编码--》测试--》运营维护 需求分析&#xff1a;进行市场分析&#xff0c;这个需求量大不大&#xff1f;投入与盈利的占比&#xff1f;技术上 能否实现或者说实现的…

深度学习 10 神经网络简介

1. 深度学习和机器学习的主要区别在于对数据的处理, 机器学习主要通过算法直接进行推断, 而深度学习主要通过神经网络对各种算法进行加权, 然后汇总得出结论. 2. 常用的激活函数: tanh函数relu函数leaky relu函数1.1 深度学习介绍 1.1.1 区别 机器学习的特征工程步骤是要靠手…

Effective Objective-C 2.0学习记录(五)

23.通过委托和数据源协议进行对象间通信 使用委托模式&#xff1a;获取网络数据的类含有一个“委托对象”&#xff0c;在获取完数据后&#xff0c;它会回调这个委托对象。 利用协议机制&#xff0c;很容易就 能以OC代码实现此模式&#xff0c;在图中演示的情况下。可以这样定义…

【Java AWT 图形界面编程】Container 容器总结

文章目录一、AWT 简介二、AWT 核心类继承体系三、Container 容器类子类四、Container 容器常用 API五、Frame 窗口示例六、Panel 示例七、窗口中文乱码处理八、ScrollPane 可滚动容器示例一、AWT 简介 Java 中 使用 AWT 和 Swing 进行 图形界面开发 , AWT 是 抽象窗口工具集 , …

线程安全问题(3)

线程不安全:在多线程的调度情况下&#xff0c;导致出现了一些随机性&#xff0c;随机性是代码中出现了一些BUG&#xff0c;导致我们的线程是不安全的 造成线程不安全的原因: 1)操作系统抢占式执行&#xff0c;线程调度随机&#xff0c;这是万恶之源&#xff0c;我们无能为力 2)…

Web进阶:Day7 响应式、BootStrap、实战演练

Web进阶&#xff1a;Day7 Date: January 10, 2023 Summary: 响应式、BootStrap、实战演练 响应式 媒体查询 目标&#xff1a;能够根据设备宽度的变化&#xff0c;设置差异化样式 媒体特性常用写法 媒体特性常用写法&#xff1a; max-width&#xff08;从小到大&#xff0…

transformers包介绍——nlp界最顶级的包——可以不用 但不能不知道——python包推荐系列

背景1 现在在AI行业&#xff0c;什么最火&#xff1f;计算机视觉还是自然语言处理&#xff1f;其实不得不说&#xff0c;现在nlp很火。还有人记得上个月很多科技爱好者都在玩的chatgpt么&#xff1f;那个就是nlp技术的一大应用。现在都在觉得AI赚钱&#xff0c;工资高&#xf…

深度学习 12 正则化

1. 对于高方差(过拟合)&#xff0c;有以下几种方式&#xff1a; 获取更多的数据&#xff0c;使得训练能够包含所有可能出现的情况 正则化&#xff08;Regularization&#xff09; 寻找更合适的网络结构 2. 对于高偏差(欠拟合)&#xff0c;有以下几种方式&#xff1a; 扩大网…

【C语言进阶】只看此篇,让你学会动态内存管理

目录 前言 一、为什么存在动态内存分配 二、动态内存函数的介绍 1 、malloc和free 2、 calloc 3 、realloc 三、常见的动态内存错误 四、动态内存管理笔试题 1 题目1&#xff1a; 2 题目2&#xff1a; 3 题目3&#xff1a; 4 题目4&#xff1a; 五、C/C程序的…

5.10回溯法--圆排列问题--排列树

圆排列问题描述 给定n个大小不相等的圆&#xff0c;要将这n个大小不相等的圆排进一个矩形框中&#xff0c;且要求个个圆都与矩形框的最底边相切。要找出最小长度的圆排列。 问题分析 排列排列&#xff0c;解空间是一个排列树。 设开始时&#xff0c;a[n]储存n个圆的半径&…

笔试强训48天——day26

文章目录一. 单选1.在单处理器系统中&#xff0c;如果同时存在有12个进程&#xff0c;则处于就绪队列中的进程数量最多为&#xff08;&#xff09;2.在系统内存中设置磁盘缓冲区的主要目的是&#xff08;&#xff09;3.下列选项中&#xff0c;会导致进程从执行态变为就绪态的事…

时间复杂度空间复杂度

算法效率数据结构算法时间复杂度大O的渐进表示法三种时间复杂度几道例题一.简单递归二结合代码来判断时间复杂度空间复杂度我们程序猿开始的时候肯定听了不少的:数据结构和算法,那么阿涛就给大家说说自己的拙见吧.数据结构 数据结构就是我们用来组织数据的方式,比如我们可以把…

JVM-【面试题】-垃圾收集算法+垃圾收集器,以后就不用担心对象那些事了

一、垃圾收集算法在jvm里对可回收的对象在不同的垃圾收集器里&#xff0c;有不同的回收算法&#xff0c;具体的可以分为这四种&#xff1a;分代收集算法、复制算法、标记清除算法、标记整理算法1.1 分代收集算法当前虚拟机的垃圾收集都采用分代收集算法&#xff0c;这种算法没有…

【NI Multisim 14.0操作实例——最小锁存器电路】

目录 序言 &#x1f525;1.设置工作环境 &#x1f525;2.设置原理图图纸 &#x1f525; 3.设置图纸的标题栏 &#x1f525; 4. 增加元器件 &#x1f525; 5. 放置总线 &#x1f525; 6. 添加总线分支 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路…

ELasticSearch监控之Cerebro安装

文章目录安装包下载安装使用点击nodes 查看各节点状态点击rest发送可以发送请求查询数据安装包下载 https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.tgzgit地址&#xff1a;https://github.com/lmenezes/cerebro 安装 将要包移动到/opt目录解…

Unity 3D 导入三维模型||Unity 3D 动画系统简介(Mecanim)

将三维模型导入 Unity 3D 是游戏开发的第一步。 下面以 3ds Max 为例&#xff0c;演示从三维建模软件中将模型导入 Unity 3D 的过程&#xff0c;具体步骤如下。 在 3ds Max 中创建房子模型。执行 Export → Export 命令导出 fbx 模型。设置保存路径以及文件名。选择默认设置选…

【transformers】tokenizer用法(encode、encode_plus、batch_encode_plus等等)

tranformers中的模型在使用之前需要进行分词和编码&#xff0c;每个模型都会自带分词器&#xff08;tokenizer&#xff09;&#xff0c;熟悉分词器的使用将会提高模型构建的效率。 string tokens ids 三者转换 string → tokens tokenize(text: str, **kwargs)tokens → strin…

安卓车机系统adb shell cmd 源码原理分析

hi&#xff0c;粉丝朋友们大家好&#xff01; 上一次视频分享了input专题课中input命令在android 12的更新&#xff0c;因为原来课程是基于android 10 &#xff08;可以加我扣&#xff1a;2102309716 优惠购买&#xff09; https://ke.qq.com/course/package/77595?tuin7d4eb3…

联合证券|金融部门开年推出新方案 改善优质房企资产负债状况

当时&#xff0c;努力促进房地产与金融正常循环是金融部门的工作要点之一。记者日前了解到&#xff0c;为遵循落实中心经济工作会议布置&#xff0c;有用防范化解优质头部房企危险&#xff0c;改进财物负债情况&#xff0c;有关部门起草了《改进优质房企财物负债表计划举动计划…