关于用舞蹈链DLX算法求解数独的解析

本文介绍如何使用DLX算法解决数独问题,通过构建特定的矩阵模型来精确覆盖数独的每个格子及其数值限制,实现数独的有效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎访问——该文出处-博客园-zhouzhendong

去博客园看该文章--传送门

 

描述

在做DLX算法题中,经常会做到数独类型的题目,那么,如何求解数独类型的题目?其实,学了数独的构建方法,那么DLX算法的精髓——构建矩阵也就慢慢的浮现了。

 

问题

假设有一个9*9的数独,我们限制每行每列以及每个3*3的小区域有且仅有1~9这些数各一个,现在我们要把1~99个数字各9个填入这个数独里面,当然,有些数字已经被添入了,求解数独。

给张图:

 

 

 

建立模型

 

首先,数独共81个格子,每个格子都得填一个数,那么,我们要精确覆盖每一个格子,所以我们首先建立1~81列。

然后还有9行,每行1~9,每行都得精确覆盖,9行,又得建立9*9=81列;

然后还有9列,每列1~9,同理。

然后还有93*3的小格子,每个里面1~9,也同理。

那么总共要建立4*81=324列。

 

那么要建多少行呢?对于某一个位置的数字,对于已知的,只需要建立一行,表示当前行的信息;如果未知,那么我们要建立9行,第i行表示当前位置填i的情况,这个时候不怕一个位置取多个值,因为前81列的构造限制了这个。

 

对于在[i,j]i=行号-1j=列号-1,位置取值k这一行的构造,要构造什么呢?

对于第一个限制,构建第i*9+j+1

对于第二个限制,构建第81+i*9+k列

对于第三个限制,构建第162+j*9+k

对于第四个限制,构建第273+((i div 3)*3+j)*9+k

 

然后DLX跑一跑就可以了

 

思考题

16*16的数独怎么做?同理。

转载于:https://www.cnblogs.com/zhouzhendong/p/Dancing-Links-X-Sudoku.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值