如何用python计算函数的值域_用Python解数独[1]:求每个单元格的行值域

目录

[2][1] 解决数独问题基本思路求每个单元格的行值域

上回书说到,我们写了行值域函数,想获得第1行每个单元格的行值域,但是获得的结果与实际有偏差,那么原因是什么呢?

row = ['',8,9,1,'',3,'','','']

def valueRange(row):

temp = copy.deepcopy(row)

row_value_range = list(range(1,10))

for i in row:

if i == '':

continue

else:

row_value_range.remove(i)

for j in temp:

if j == '':

j = row_value_range

else:

j = [j]

return temp

print(valueRange(row))

PS D:\python\0624-soduku> python test5.py

['', 8, 9, 1, '', 3, '', '', '']

我们可以借助VS Code通过调试工具,我们发现在遍历temp时,虽然我们不断在为j重新赋值,但是temp却一直没有变化

def valueRange(row):

temp = copy.deepcopy(row)

row_value_range = list(range(1,10))

for i in row:

if i == '':

continue

else:

row_value_range.remove(i)

for j in temp:

if j == '':

j = row_value_range

print(temp)

else:

j = [j]

print(temp)

return temp

print(valueRange(row))

PS D:\python\0624-soduku> python test5.py

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

['', 8, 9, 1, '', 3, '', '', '']

同理,记上print后,我们发现我们在遍历temp时为j重新赋值,但temp的值没有发生变化

为什么?

简单的说,在遍历一个列表时,是不能改变列表中的值的,具体原因大家自行查询或者看这篇博客

经过搜索,我们可以换一种方式遍历列表,这样就能在循环过程中修改列表值了

def valueRange(row):

temp = copy.deepcopy(row)

row_value_range = list(range(1,10))

for i in row:

if i == '':

continue

else:

row_value_range.remove(i)

for j in range(9):

if temp[j] == '':

temp[j] = row_value_range

else:

temp[j] = [temp[j]]

return temp

执行一下代码,发现结果与预期相符

print(rowValueRange(row))

PS D:\python\0624-soduku> python test5.py

[[2, 4, 5, 6, 7], [8], [9], [1], [2, 4, 5, 6, 7], [3], [2, 4, 5, 6, 7], [2, 4, 5, 6, 7], [2, 4, 5, 6, 7]]

现在我们已经可以输入一行,然后输出这一行每个单元格的行值域。

下一步我们需要输入整个数独,然后整个数独每个单元格的行值域。

很简单,数独是一个二维数组,里面的每个元素就是一行,我们只要遍历数独这个数组,然后对每个元素执行rowValueRange函数,然后把每一行的输出保存在一个新列表就好了,代码

def valueRange(row):

temp = copy.deepcopy(row)

row_value_range = list(range(1,10))

for i in row:

if i == '':

continue

else:

row_value_range.remove(i)

for j in range(9):

if temp[j] == '':

temp[j] = row_value_range

else:

temp[j] = [temp[j]]

return temp

def rowValueRange(soduku):

row_value_range = []

for row in soduku:

row_value_range.append(valueRange(row))

return row_value_range

我写了一个新的函数rowValueRange(),输入数独数组(soduku),然后用row_value_range这个列表保存每个元素(每行)的行值域,最后输出row_value_range也就是数独的行值域,我们来执行代码

for i in rowValueRange(soduku):

print(i)

PS D:\python\0624-soduku> python test5.py

[[2, 4, 5, 6, 7], [8], [9], [1], [2, 4, 5, 6, 7], [3], [2, 4, 5, 6, 7], [2, 4, 5, 6, 7], [2, 4, 5, 6, 7]]

[[1, 3, 5, 6, 9], [2], [7], [4], [1, 3, 5, 6, 9], [1, 3, 5, 6, 9], [8], [1, 3, 5, 6, 9], [1, 3, 5, 6, 9]]

[[1, 3, 4, 6, 7, 8, 9], [1, 3, 4, 6, 7, 8, 9], [1, 3, 4, 6, 7, 8, 9], [5], [2], [1, 3, 4, 6, 7, 8, 9], [1, 3, 4, 6, 7, 8, 9],

[1, 3, 4, 6, 7, 8, 9], [1, 3, 4, 6, 7, 8, 9]]

[[1, 2, 3, 4], [7], [6], [9], [1, 2, 3, 4], [1, 2, 3, 4], [5], [1, 2, 3, 4], [8]]

[[8], [4, 5, 7, 9], [3], [6], [4, 5, 7, 9], [1], [2], [4, 5, 7, 9], [4, 5, 7, 9]]

[[2, 9], [4], [5], [3], [8], [7], [1], [6], [2, 9]]

[[7], [6], [8], [2], [1], [4], [3], [9], [5]]

[[9], [3], [1], [7], [6], [5], [4], [8], [2]]

[[4], [1, 3, 5, 7, 8], [2], [1, 3, 5, 7, 8], [1, 3, 5, 7, 8], [9], [1, 3, 5, 7, 8], [1, 3, 5, 7, 8], [6]]

从最终结果来看,我们已经搞定了数独的行值域,但列值域和九宫格值域应该如何搞定呢?

数独里的每一行,就是数独的每一个元素,因此我们可以很方便的循环数组,然后输入每一行输出这一行的行值域。

但是列和九宫格呢?

列相当于选取每一行相同编号的元素组成新的列表(比如:第1列是选取每一行的第1个元素);

九宫格就更复杂一些,相当于根据某个规则选取相邻三行的9个元素,组成新列表(比如:第1个九宫格是选取前三行每行的前三个元素,共9个元素组成了九宫格)。

那么如何把我们发现的规律用代码来表达,求列值域和九宫格值域该怎么求,有没有捷径?

预知后事,且听下回分解。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值