解数独,学编程 -python 3

数独中每个格子地址的表示

上次我们已经学会了用列表来表示一个数独的值。 当某个空格的值我们不能决定时,可以用一个字符串来表示多个值, 比如下面,就表示A1处1到9都有可能,不能确定。
line1 = [‘123456789′,’7′,’8′,’123456789′,’123456789′,’123456789′,’123456789′,’123456789′,’123456789’]
这个是上次的作业。


本篇的目标是介绍如何用Python代码来实现一些最基本的数独的概念。
我们知道,每个数独的格子都是编号了, 比如 ’A1‘, ’B2‘ 等等。这些编号可以当做地址,所以快速生成这些地址也非常重要。

DIGITS意思是数字, 这里是一个字符串, 还有从1到9这些字符。

ROWS意思是行,含有’A‘ 到 ’I‘ 这些字符。 那么COLS就表示列, 行是字母, 列是数字。 上面是Python里面的三个字符串变量。


我们要写一个函数, 输入是行和列的表示,输出是一个数独格子的地址表示。

函数的定义和使用

函数在编程语言里可以根据一个功能,把一些语句组合起来。这样可以实现代码的重复使用,而且也容易阅读代码。

在代码中,函数涉及到定义和调用。

比如,下面就是一个函数的定义: 它始于用def 定义的函数名字。

def add(a,b):    
    return a+b 

这个函数输入两个值 a 和b,输出一个值, a与b的和。 return的意思是返回。

把a与b的和返回到函数的调用的地方。 这个函数的使用方法如下:

c = add(100, 200)

在函数执行的时候, a=100, b=200, 返回的就是 (a+b) = (100 + 200 ) = 300

函数定义中一遇到return , 函数就退出了, 返回到调用的地方。 在这里返回了300, 然后c这个变量的值是300 。


我们要写一个输入是行和列的值,输出可以表示每个格子的位置。

def cross(A, B):    
     # "Cross product of elements in A and elements in B."    
     return [a+b for a in A for b in B]


这个函数严格来讲只有两行, 里面要理解的概念倒不少。

首先就是列表的生成。


[a+b for a in A for b in B]


我们已经知道,用[]可以生成列表。 可是,这里的列表生成语句好奇怪啊。
我们先看 “for a in A”, 这部分的意思是说,对于每一个在A中的元素a 。

后面紧跟着 “for b in B”, 意思是 对于每一个在B中的元素b。
a+b 表示两个元素相加。我们知道 1+3 = 4而’1‘+’3‘ 就变成了 ’13‘而’A‘ + ’4‘ 就变成了 ’A4‘ 了。


如果我们不用列表生成语句,而是用普通的编程语句来实现,程序可能需要这样:

假如A = ‘abcd’, B= ’1234‘ 那么 程序执行的顺序就是:

先从A中取第一个元素’a‘,然后顺序从B中取各个元素’1234’,做加法,形成

      'a' + '1'  = 'a1'        
      'a' + '2'  = 'a2'  
      'a' + '3' =  'a3' 
      'a' + '4' =  'a4'         

然后从A中取第二个元素’b‘, 接着从B中取各个元素’1234′, 做加法,形成

'b' + '1' = 'b1'

'b' + '2' = 'b2'

'b' + '3' = 'b3'

'b' + '4' = 'b4'


以此类推。最后形成了一个列表, 结果是这样的

[‘a1′,’a2′,’a3′,’a4′,’b1′,’b2′,’b3′,’b4’, …. ‘d4’] 所以, 下面的列表生成语句就是先从A中取元素,然后再在B中取元素,做加法,最后形成一个列表。

[a+b for a in A for b in B]

由此,我们可以得出结论 函数 cross(A,B) 就是生成了一个新的列表,这个列表中每个元素都是来自于A和B的组合。

如果我们调用下面的语句:

CELLS = cross(ROWS, COLS)

CELLS变量的值就是一个列表, 其中包含了 [‘A1′,’A2′,’A3′,’A4’ …. ]

CELLS的意思是单元。 我们用它来保存数独中每个格子的地址。

作业

1. 已经知道一个列表A,其中都是数值, 请构造一个新的列表,其中每个元素都是列表A中元素的3倍。


2. 一个字符串A,内容是’this is good’, 请构造一个新的列表, 其中每个元素都是字符串A中字符的大写, 比如 [‘T’,’H’,’I’, ‘S’, ‘I’, ‘S’, ‘G’, ‘O’, ‘O’, ‘D’]


3. 理解CELLS中的元素值, 看它是怎么形成的。

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用*标注