目录
- 用Python解数独[0]
- 用Python解数独[1]:求每个单元格的行值域
- 用Python解数独[2]:求列值域和九宫格值域
- 用Python解数独[3]:求总值域
- 用Python解数独[4]:缩减值域
- 用Python解数独[5]:检测唯一值缩减值域
- 用Python解数独[6]:递归获得最终答案
- 用Python解数独[7]:递归(完结篇)
[2][1] 解决数独问题基本思路
- 求每个单元格的行值域
上回书说到,我们写了行值域函数,想获得第1行每个单元格的行值域,但是获得的结果与实际有偏差,那么原因是什么呢?
row
我们可以借助VS Code[1]的调试工具,或者在函数里加print来看在运行过程中哪里出现了问题
def
同理,记上print后,我们发现我们在遍历temp时为j重新赋值,但temp的值没有发生变化
为什么?
简单的说,在遍历一个列表时,是不能改变列表中的值的,具体原因大家自行查询或者看这篇博客[2]
经过搜索,我们可以换一种方式遍历列表,这样就能在循环过程中修改列表值了
def
执行一下代码,发现结果与预期相符
print
现在我们已经可以输入一行,然后输出这一行每个单元格的行值域。
下一步我们需要输入整个数独,然后整个数独每个单元格的行值域。
很简单,数独是一个二维数组,里面的每个元素就是一行,我们只要遍历数独这个数组,然后对每个元素执行rowValueRange函数,然后把每一行的输出保存在一个新列表就好了,代码
def
我写了一个新的函数rowValueRange(),输入数独数组(soduku),然后用row_value_range这个列表保存每个元素(每行)的行值域,最后输出row_value_range也就是数独的行值域,我们来执行代码
for
从最终结果来看,我们已经搞定了数独的行值域,但列值域和九宫格值域应该如何搞定呢?
数独里的每一行,就是数独的每一个元素,因此我们可以很方便的循环数组,然后输入每一行输出这一行的行值域。
但是列和九宫格呢?
列相当于选取每一行相同编号的元素组成新的列表(比如:第1列是选取每一行的第1个元素);
九宫格就更复杂一些,相当于根据某个规则选取相邻三行的9个元素,组成新列表(比如:第1个九宫格是选取前三行每行的前三个元素,共9个元素组成了九宫格)。
那么如何把我们发现的规律用代码来表达,求列值域和九宫格值域该怎么求,有没有捷径?
预知后事,且听下回分解。
下一篇链接:用Python解数独[2]:求列值域和九宫格值域
参考
- ^VS Code是微软公司出品的一款代码编辑器 https://code.visualstudio.com/
- ^详见博主给第一个留言的回复 https://blog.csdn.net/u013272574/article/details/84319661