MATLAB 解数独

article/2025/10/2 3:30:19

数独是一种较为常见的游戏,一般有4乘4、6乘6、9乘9几种,就像下面这种,本文也是主要求解此类数独。

图一

此外还有一些奇形怪状的,如下图两种,均是不规则的,在此并不会涉及,但会在以后发布代码以及过程。

在这里插入图片描述

在这里插入图片描述

首先在MATLAB中新建一个文本文件,用来存放原始数独,用空格间隔开,用‘0’来替代需要填数值的位置,就像下图,然后命名为date.txt即可。

在这里插入图片描述

接下来新建一个脚本文件,命名为Untiltled2.m。在Untiltled2.m中打开文本,并存入变量shudu之中,在调用disp函数,将shuzu变量输出到命令行中。

shudu= textread('date.txt');
disp(shudu);

接下来判断该格子受否可以填入某数字,如第一张图中,第一个格子所填的数,用该满足在该行,该列,以及该小单元内不能有重复,因此,需要对是否有重复进行判断。

首先是进行行判断,要求遍历1~9九个数字,如果在该行中的原始数据已经存在该数字,即返回false,如果没有,即返回true。新建一个函数,命名为chack_hang,用来判断第i行,第j列中是否可以填数值num,返回值是false或者true。

function result= chack_hang( shudu,i,j,num )%定义函数result=true;%默认为真,值可以传入,并进行下面的判断for lie=1:9if shudu(i,lie)==num% 当result=false;break;endend
end

再是对列进行遍历,与行遍历的原理相同。

function result= chack_lie( shudu,i,j,num )result=true;for hang=1:9if shudu(hang,j)==numresult=false;break;endend
end

当对行以及列遍历完成后,在对每一个大格子进行遍历。

function result= chack3_3( shudu,i,j,num )
result=true;
maxhang=floor((i-1)/3)+1;
maxlie=floor((j-1)/3)+1;
hang_to=maxhang*3;
hang_from=hang_to-2;
lie_to=maxlie*3;
lie_from=lie_to-2;
for i=hang_from:hang_tofor j=lie_from:lie_toif shudu(i,j)==numresult=false;break;endend
end

由于有些数独有主对角线元素不能相同的规定,因此在编写一个控制主对角线元素的函数。

function  result= chack_xie(shudu,i,j,num)
result = true;
if i==jfor hang=1:9if shudu(hang,hang)==numresult=false;break;endend
end
if i==10-jfor hang=1:9if shudu(hang,10-hang)==numresult=false;break;endend
end

最后在将前三组的便利组合起来,以便找出所有符合的数字。

对于有些数独,要求主对角线元素也不能重复,只要取消下面这串代码中标注行的注释符号即可

function result = chack_all(shudu,i,j,num)if chack_hang(shudu,i,j,num)==falseresult=false;elseif chack_lie(shudu,i,j,num)==falseresult=false;elseif chack3_3(shudu,i,j,num)==falseresult=false;% elseif chack_xie(shudu,i,j,num)==false %要求主对角线上的元素不能想等%    result=false;else result=true;end
end

最终通过函数递归调用,来寻找出所有的可能结果。

function jsd(shudu,id)
if id>81disp(shudu)
elsehang=floor((id-1)/9)+1;lie=mod(id-1,9)+1;if shudu(hang,lie)~=0jsd(shudu,id+1);elsefor num=1:9if chack_all(shudu,hang,lie,num)==trueshudu(hang,lie)=num;jsd(shudu,id+1);endendend
end
end

新建一个脚本文件,在里面调用函数jsd即可。

shudu= textread('date.txt');
disp(shudu);
jsd(shudu,1);

即可求解出数独的解。如上述数独中的求解结果。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/xpw8eHpU.shtml

相关文章

Leetcode 解数独

解数独 题目描述: 编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。提示:…

再战leetcode (解数独)

37. 解数独 题目描述 回溯法 leetcode题解 代码 public class Test {public static void main(String[] args) {char[][] board {{5, 3, ., ., 7, ., ., ., .},{6, ., ., 1, 9, 5, ., ., .},{., 9, 8, ., ., ., ., 6, .},{8, ., ., ., 6, ., ., ., 3},{4, ., ., 8, ., 3, .…

回溯算法解数独问题(java版)

下面来详细讲一下如何用回溯算法来解数独问题。 下图是一个数独题,也是号称世界上最难的数独。当然了,对于计算机程序来说,只要算法是对的,难不难就不知道了,反正计算机又不累。回溯算法基本上就是穷举,解这…

014. 解数独

1.题目链接: 37. 解数独 2.解题思路: 2.1.题目要求: 暂时的理解就是,编写一个程序然后自动填完数独,填完返回(不用求解各种不同的数独组合) 填的时候,数字要满足的规则&#xff1…

回溯算法—解数独

什么是回溯法? 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择&…

解数独--难的一批

1题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数…

解数独 — Python

文章目录 解数独1、程序简介示例:输入:输出:解释:提示: 2、程序代码3、运行结果 解数独 1、程序简介 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每…

【每日刷题】解数独

题目地址 https://leetcode-cn.com/problems/sudoku-solver/ 题目描述:解数独 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-…

算法学习:37. 解数独

解数独 题目链接:力扣题目链接 难度:困难 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫…

数独解题方法大全

数独这个数字解谜游戏,完全不必要用到算术!会用到的只是推理与逻辑。解题方法分两大类:直观法和候选数法。 直观法就是不需要任何辅助工具,从接到数独谜题的那一刻起就可以立即开始解题。绝不猜测。数独直观法解题技巧主要有&…

37.解数独

37. 解数独(难度:困难) 题目链接:https://leetcode-cn.com/problems/sudoku-solver/ 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。数…

安装搜狗输入法成功,每次都折腾,记录一下这次的成功经验。

1:卸载fcitx sudo apt-get --purge fcitx* 2:清理系统内的无用的软件包 sudo apt-get --purge autoremove 3:到搜狗官网下载搜狗拼音输入法,选择你系统对应的软件包,我系统是64位的,所以我选择了amd64的 ht…

Ubuntu16.04 python2.7升级python3.5

原文地址:https://www.cnblogs.com/wmr95/p/7637077.html Ubuntu16.04 python2.7升级python3.5 正常情况下,你安装好ubuntu16.04版本之后,系统会自带 python2.7版本,如果需要下载新版本的python3.5,就需要进行更新。下…

(转)解决Ubuntu2.6.31-20内核更新问题:Unable to mount root fs on unknown-block(x,x)

原文章:http://hi.baidu.com/%D2%BB%B5%E3%C7%E7/blog/item/d3b0df30da10a115ebc4afa3.html Ubuntu2.6.31-20内核更新问题:Unable to mount root fs on unknown-block(x,x) WUBI装的ubuntu。在更新了最信的内核 2.6.31-20,启动时出现提示&a…

Git客户端的简单使用(注册-gt;应用)

参考文档: Ubuntu下git安装与使用:https://jingyan.baidu.com/article/dca1fa6f43c965f1a540524d.html Ubuntu下使用SSH KEY:https://jingyan.baidu.com/article/5bbb5a1bff545613eba17915.html 1. 通过apt源安装git命令行工具 这里不建…

windows10下的Ubuntu18.04的双系统的安装

windows下装Ubuntu18.04的双系统作为菜鸟,照着大神们的教程装了几遍,给大家分享一下流程。(默认装好Windows10) 1.【Win10上安装的软件】可在Win10上提前下载安装EasyBCD软件,用于之后开机时的双系统切换;…

[Linux 基础] -- Linux DRM (二) 基本概念和特性 - Rockchip

一、楔子 上篇文章中我们有讲过 DRM 是 Linux 下的图形渲染架构,用来管理显示输出、图层合成与更新、内存管理、分辨率设置等等功能的一套显示管理框架。应用程序可以直接操纵 drm 的 ioctl 或者是用 framebuffer 提供的接口进行显示相关操作。后来大家觉得这样太 …

ubuntu mysql5.7配置_MySQL5.7在Ubuntu上的安装、配置与使用

环境:html Ubuntu 1804 64位 python 待安装:MySQL5.7版本mysql 1、安装 一、下载mysql-apt的配置包,并安装 或者下载社区版本mysql5.7 https://www.cnblogs.com/metianzing/p/9050204.html sql 在安装的过程当中,会要求选择mysql版…

master节点怎么安装mysql软件_Windows下搭建MySQL Master Slave

转:http://www.cnblogs.com/gaizai/p/3248207.html http://www.cnblogs.com/gaizai/archive/2013/03/15/2961868.html MySQL表数据迁移自动化 http://www.cnblogs.com/gaizai/archive/2012/10/23/2735556.html Ubuntu10下MySQL搭建Master Slave 一、背景 服务器上…

虚拟机安装ubuntu20服务器版,【Linux】 Windows安装VMware虚拟机安装Ubuntu系统20.04LTS图文教程...

这是一期VMware虚拟机安装Ubuntu系统的教程,用虚拟机是由于它安全性,可靠性高!测东西坏了重装一下又能继续了,能够不断的循环使用,方便快捷不会影响到你的电脑!那么直接开始吧!!html…