标准数独的求解

2023-05-16

上机题目中有一道题目的要求是通过编程实现数独的求解,然后想起了初三去后来所在的高中面试提前录取的时候里面的压轴题便是数独,当时做了好长时间也没搞出来,我还记得监考老师当时和我说:“做不出来就别勉强,先做其他题”,然后就吊死了,最后八道题只对了五道,不过运气还不错,提前录取还是通过了。
不小心说了一些题外话,下面步入正题:
和之前的题目一样,由于评判系统暂未开放,所以我实现后直接放洛谷里面评分了,三个测试点,一个TLE,两个AC,TLE的测试点是题目中给的输入输出样例,运行结果是没问题的,可能还需要进一步的优化。
在这里插入图片描述
在这里插入图片描述
编程中两种不同的思路
第一种是联想到之前做的一道洛谷题里面的一个数学方法:当两个只含正整数的集合的所有元素的和与积分别相等时,这两个集合相同(这个证明起来比较容易,就不在细说了),然后我的想法就是可以把这个思想用在判断行和列的元素判重的过程里,因为每一行\列都是1~9的一个排列,再对未知元素调用c++生成排列的函数进行穷举(因为算法标签是DFS嘛,所以穷举也不一定TLE),但是仔细想一想,这个要对9行9列都进行判断,此外还要想办法解决9个九宫格的判重问题,所以运行时间可能会很长,于是便放弃这种想法,改用深搜。
进行深搜的对象就是初始二维数组里面为0的元素,然后需要通过判断寻找该位置可以填的数字有哪些,行和列的判重用一个简单的遍历就可以了,然后考虑对于第i行第j列的元素,如果填入数字num的话符不符合条件

int k,x,y,l;
if(i%3==0)  y=i/3;//得出竖着第几个方块
else 		y=i/3+1;
if(j%3==0)  x=j/3;//得出横着第几个方块
else 		x=j/3+1;

先通过简单处理判断出该元素所处的小九宫格的位置,如果有重复的话,返回false

for(k=(y-1)*3+1;k<=y*3;k++)//判断该方块中是否有重复的
{
	for(l=(x-1)*3+1;l<=x*3;l++)
	{//如果所填数字相同且不与该元素角标重合,则存在重复
		if(a[k][l]==num&&k!=i&&l!=j)
		return false;
	}
}

判重工作做完以后基本就是套用DFS的框架了,大概了解dfs的话,应该就没什么问题了,直接附代码了:

#include<bits/stdc++.h>
using namespace std;

int flag,a[10][10];

bool judge(int i,int j,int num)
{
	int k,x,y,l;
	if(i%3==0)  y=i/3;//得出竖着第几个方块
	else 		y=i/3+1;
 
	if(j%3==0)  x=j/3;//得出横着第几个方块
	else 		x=j/3+1;
 
	for(k=1;k<=9;k++)//判断一行是否有重复的
	{
		if(a[i][k]==num&&k!=j)   
		return false;
	} 
	for(k=1;k<=9;k++)  //判断一列是否有重复的
	{
		if(a[k][j]==num&&k!=i)   
		return false;
	} 
	for(k=(y-1)*3+1;k<=y*3;k++)//判断该方块中是否有重复的
	{
		for(l=(x-1)*3+1;l<=x*3;l++)
		{
			if(a[k][l]==num&&k!=i&&l!=j)
			return false;
		}
	} 
	return true;
}

void dfs(int x,int y)
{
    //加上flag,表示其输出一个符合条件的答案就退出
    if(flag) return;
	int i;
	if(x==10)//满足条件输出
	{
	    flag = 1;
		for(i=1;i<=9;i++)
		{
			for(int j=1;j<=9;j++)
			{
				cout << a[i][j] << " ";
			}
			cout << endl;
		}
		return;
	}
	if(a[x][y]==0)//判断是否有数
	{
		for(i=1;i<=9;i++)
		{
			if(judge(x,y,i))
			{
				a[x][y]=i;
				dfs(x+(y+1)/10,(y+1)%10);//往后一个数,到头换行
			}
		}
		a[x][y]=0;//回溯
	}
	else
		dfs(x+(y+1)/10,(y+1)%10);//有数则搜索下一个
	return;
}

int main()
{
	int i,j;
	for(i=1;i<10;i++)
	{
		for(j=1;j<10;j++)
		{
			cin >> a[i][j];
		}
	}
	dfs(1,1);
	return 0;
}

可能dfs掌握的还不太好,所以还需要优化(看了一下洛谷的提交记录,最快的有13ms的,上机的那个平台我记得是没有时间限制的,苦于完成深度学习作业的我暂时就不优化了),嗐,菜鸡的自我提升之路任重而道远…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准数独的求解 的相关文章

  • 人工智能学习:CIFAR-10数据分类识别-VGG网络(5)

    这里尝试采用VGG网络对CIFAR 10数据集进行分类识别 1 导入需要的模块 span class token keyword import span numpy span class token keyword as span np s
  • 人工智能学习:PASCAL VOC数据集读取(6)

    PASCAL VOC是一个国际的计算机视觉挑战赛 xff0c 数据集包含了20个分类的3万多张图片 挑战赛及其数据集基础上涌现不少知名的目标检测模型如R CNN xff0c YOLO xff0c SSD等 可以通过下载和读取的方法载入PAS
  • 人工智能学习:Microsoft COCO数据集读取(7)

    Microsoft COCO xff08 Common Objects in Context xff09 是微软研发维护的一个大型的数据集 包含了30多万张图片和91个目标分类 可用于目标识别 xff08 Object Detection
  • 人工智能学习:ResNet神经网络(8)

    ResNet是一种非常有效的图像分类识别的模型 xff0c 可以参考如下的链接 https blog csdn net qq 45649076 article details 120494328 ResNet网络由残差 xff08 Resi
  • 人工智能学习:倒立摆(CartPole)(9)

    倒立摆是强化学习的一个经典模拟对象 xff0c 通过对倒立摆对象的持续的动作输入 xff0c 使倒立摆保持在竖立的状态或者倒下 Python提供了一个模拟库 xff08 gym xff09 来模拟倒立摆等一些典型的难度控制对象 首先载入gy
  • 理解卡尔曼滤波

    卡尔曼滤波被广泛的应用于运动估计中 xff0c 在飞行器中多有应用 xff0c 区别于普通滤波如低通滤波 xff0c 卡尔曼滤波具有不延时的优点 xff0c 即普通的低通滤波在过滤噪声的同时也会引入信号滞后 xff0c 而卡尔曼滤波则可以实
  • 【Kotlin】Kotlin函数那么多,你会几个?

    目录 标准函数letrunwithapplyalsotakeIftakeUnlessrepeat小结作用域函数的区别作用域函数使用场景 简化函数尾递归函数 xff08 tailrec xff09 扩展函数高阶函数内联函数 xff08 inl
  • 2021-02-13

    昨天学习了关于位运算的一些常识 xff0c 自己也跟着视频敲了一些位运算代码如下 xff1a package com raisecom tiap ems basic mgt domain acl import java util Array
  • 字符串匹配中KMP算法的next数组构造与思考

    对于KMP算法的next算法 xff0c 匹配规则i不动 xff0c j而是根据 next j 61 k 如果在j位置失配 xff0c 则退到k位置 构造next数组的 是根据前缀与后缀的最长匹配 如ababaa 的next数组是 1001
  • 字符串匹配的后缀数组的直接比较和利用rank[i]=k的倍增法

    public static Suff getSa String s Suff SuffArrays 61 new Suff s length sa i 61 k表明的排名为i的后缀是从k开始的 for int i 61 0 i lt s l
  • 关于求后缀数组的公共前缀的长度height数组求法思路与代码

    字符串匹配之后缀数组 概念 xff1a 后缀数组 xff1a 是所有后缀按字典排序后 xff0c 数组中记录的起始下标 sa 0 61 5 起始下标为5的后缀 在所有后缀中字典最小 rank数组 xff1a 是给定后缀下标 xff0c 返回
  • Excel 2013 Power Programming with VBA 翻译

    第14 章 xff1a 基于VBA开发的Excel实用工具 545页 是什么让它成为一个优秀的工具 xff1f Excel工具 xff0c 理所应当的让你的工作变得更容易或者更有效 但是 如果你正在为其他用户开发一个实用工具 xff0c 你
  • myeclipse中编写小java项目遇到的一些问题(持续更新)

    刚开始学习java程序 xff0c 读了 lt lt thingking in java gt gt 刚开始编写正常 xff0c 可后来再次打开时看到所创建的java项目都会出现红色叉号 后来搜了一会儿却还是什么感觉很乱 xff0c 最好也
  • IT成长录

    少壮不努力 xff0c 老大学IT xff0c 初次听到这句话是我大学老师在一次上课时看到满班乱哄哄的气氛说的 xff0c 当时以为他是嘲讽我们或者是略微自嘲呢 xff0c 现在回想起来有些不一样的感觉 从自己第一份接触IT工作 xff08
  • 我所了解的大数据

    大数据如今越来越热 xff0c 数据量再大不会用 xff0c 放到那里也是存储垃圾 所以随着数据量的越来越大 xff0c 对数据的各种处理和挖掘需求也很多 这就促进分布式存储和计算软件的快速发展 xff0c 集群的规模也越来越大 从以前的某
  • 通过Jetty搭建一个简单的Servlet运行环境

    最近在做一些简单的Servlet开发的时候 感觉每次调试的时候都要发布到tomcat上很麻烦 把程序共享给同事也很麻烦 需要帮他设置本地的tomcat环境 在网上找了找其他的Servlet运行环境 发现用Jetty可以很方便的实现嵌入式We
  • 一些常用的Maven Plugin配置

    Maven是一个常用的Java build Manager 使用Maven可以很好的对Java Project的dependency进行管理 这里我记录几个比较常用的Plugin配置 生成JAR打包文件 lt plugin gt lt gr
  • 【Android】测试方法汇总,助力打造完美应用

    目录 Log 打印日志Junit 单元测试Debug 断点调试Monkey 压力测试Profiler 性能分析器ADB 无线连接设备Appium 自动化测试BlockCanary 界面卡顿检测App Inspection 应用程序检查Dat
  • 在Java项目中整合Scala

    Scala是一个运行在Java JVM上的面向对象的语言 它支持函数编程 xff0c 在语法上比Java更加灵活 xff0c 同时通过Akka库 xff0c Scala支持强大的基于Actor的多线程编程 具有这些优势 xff0c 使得我最

随机推荐

  • 小议企业开发部门的分工与合作

    周五帮以前部门的同事查一个测试环境的权限错误的问题 一个用户在系统里的权限设置 xff0c 一切很正常 但是从中间层的权限检查老报错 虽然这个系统的权限检查部分是我一年多以前做的 xff0c 而我已经换到另外一个部门有一段时间了 xff0c
  • 语言之争

    Java和 Net选哪个 xff1f 这是每一个菜鸟都必须要面对的问题 Java 可能是大多数程序员学习的第一个面向对象的编程语言 它最大的优势就是跨平台性 其实 xff0c 在国内小型机当道的时代 xff0c Java 是唯一可以选择的开
  • Oracle数据库小白使用记 -- 通过存储过程提取数据

    本人是Oracle数据库小白 xff0c 一直都是用Sql Server的 xff0c 最近到被安排到一个项目去救火 这个项目使用的Java和Oracle数据库的组合 xff0c 没办法 xff0c 一切要从头学起 其实这个项目本身并不是很
  • 分享一个简单的Tomcat本地开发脚本

    最近在搞java web service xff0c 一开始开发的时候都是用Maven集成Jetty来运行 xff0c 感觉很方便 但是 xff0c 当需要一次运行多个war的时候就显得力不从心了 同时 xff0c
  • 我和Java 8的第一次亲密接触

    周五上班偶然发现单位的系统里有Java 8可以用了 xff0c 周六无事 xff0c 把自己现在在做的一个项目从Java 1 6升级到了1 8 过程并不是一番风顺 xff0c 在此记录 xff0c 希望可以对各位看客有所帮助 先说说现在在做
  • C#中调用PDFCreator生成PDF文件

    前一阵子做了一个生成报表的小project xff0c 生成的报表是关于股价的记录 没有什么现成的包和第三方程序给我们用 xff0c 听说WPF渲染的页面可以之间存成PDF xff0c 不过只是道听途说 xff0c 没敢真正实践 xff0c
  • 一个简单的审批流程模型

    最近在做一个审批流程的模块用来支持对一些事务的审批 基本的业务要求如下 xff1a 1 模型需要支持两级审批 xff0c 在这里我们定义为有一半权限的B Approver xff0c 和有更高权限的C Approver xff1b 2 每一
  • node.js连接Sql Server数据库

    最近对node js比较感兴趣 xff0c 网上的例子大多都是node js集成MongoDB 我对MongoDB实在不是太感冒 xff0c 并不是因为它有什么不好听 xff0c 只是在工作上的确是很难遇到 在工作上还是和Sql Serve
  • 由有向图的邻接矩阵生成其可达矩阵

    矩阵是研究图的性质的最有效工具之一 xff0c 可运用矩阵运算求出图的路径 回路和其它性质 有些时候我们需要知道所给的图G中的某两个点之间是否存在边 xff0c 为此前人引入了可达矩阵 定义不再赘述 xff0c 在此给出一个由公式实 现的代
  • 【Android】串口通信的理论与使用教程

    Android系统诞生这十几年以来 xff0c Android开发工程师岗位经历了由盛转衰的过程 xff0c 目前纯UI的Android APP已经鲜有公司愿意花费巨资去开发 xff0c Android APP开发的业务也仅剩游戏 物联网
  • 《自己动手写Docker》书摘之三---Union File System介绍

    Union File System UnionFS unionfs是一种为Linux xff0c FreeBSD和NetBSD操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务 它使用branch把不同文件系统的文件和目录 透明
  • 《程序设计基础课程设计》实验报告

    程序设计基础课程设计 实验报告 班 级 xff1a 学 号 xff1a 姓 名 xff1a 完成题目 xff1a 1 2 3 4 5 6 概述 此次六道题目里面第四题是参考某博主的文章后实现的 xff0c 有一些地方仍然不是特别理解 xff
  • C语言实现关系的闭包运算

    问题描述 xff1a 利用矩阵求解有限集上给定关系的自反和对称闭包 输入格式 xff1a 首先输入关系矩阵R的维数 xff0c 回车之后输入矩阵每个元素 xff0c 以空格或回车分开 只能输入0或1 输出格式 xff1a 输出自反闭包关系矩
  • 简单易懂的C语言课程设计图书管理系统

    最近几天一直在做课程设计的作业 xff0c 图书管理系统是其中的第六题 xff0c 和同学交流的时候发现好多人都用了链表去写 xff0c 但是我感觉没必要 xff0c 所以使用的代码比较基础 xff0c 适合初学者借鉴 先看一下题目 xff
  • C语言程序设计——前两道题(判断有效三角形和高精度计算的加减法)

    第1题 1 原题 xff1a 假设平面上有1 N x y 个坐标点 xff0c 编程判断这N x y 个点能组成多少个有效三角形 问题分析 xff1a 本题为一道基本编程题 xff0c 要点就是判断三个点能构成三角形的条件 解决方案 xff
  • C语言程序设计之RLE压缩解压算法

    先介绍一下RLE压缩算法 xff1a 游程编码 xff08 Run Length Encoding RLE xff09 又称行程长度编码或者变动长度编码法 xff0c 在控制理论中对于二值图像而言是一种编码方法 xff0c 对连续的黑 xf
  • 浅析洛谷P4924(一道普及/提高-的题目)的解决方法

    题目描述 xff1a Scarlet最近学会了一个数组魔法 xff0c 她会在n n二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90 首先 xff0c Scarlet会把1到n 2的正整数按照从左往右 xff0c 从上至下的顺序填入初
  • 判断图的连通性

    上机系统的判分功能目前还没开放 xff0c 所以以下所给代码仅供参考 xff0c 并不能保证完全正确 xff08 自己分别测试了强连通 xff0c 单向连通 xff0c 弱连通 xff0c 不连通的一个样例 xff0c 都过了 xff09
  • BMP格式详解

    BMP xff08 全称Bitmap xff09 是Windows操作系统中的标准图像文件格式 xff0c 可以分成两类 xff1a 设备相关位图 xff08 DDB xff09 和设备无关位图 xff08 DIB xff09 xff0c
  • 标准数独的求解

    上机题目中有一道题目的要求是通过编程实现数独的求解 xff0c 然后想起了初三去后来所在的高中面试提前录取的时候里面的压轴题便是数独 xff0c 当时做了好长时间也没搞出来 xff0c 我还记得监考老师当时和我说 xff1a 做不出来就别勉