数独就是一种数字猜谜游戏了,相信不少人都玩过。 为了方便从来没有玩过的同学继续阅读这一系列的文字,这里会简单介绍一下这个游戏的规则和玩法。 懂得了游戏怎么玩,接下来就是要学习怎么用Python来玩数独游戏。 用编程来解决实际问题,涉及到几个方面的内容,一个是Python语言的基本知识,另一个是用语言来解决问题的思维方式,就是计算思维,再一个就是动手实操和练习,把问题实实在在的通过写代码来解决。

这些内容如果挤到一篇文字里面 ,内容显得会有点多,阅读起来也不方便。所以,我们会分几个个部分。


面向的读者

这一系列文章面向的读者是4年级以上,有兴趣学习Python编程的小朋友。希望你喜欢阅读,喜欢尝试, 愿意动脑筋思考问题。 另外, 没有编程基础的成人也会从中受益。

如果您的孩子自学能力欠佳,可以考虑联系报我们的线下编程课。 另外,除了线下Python编程课,我们有计划推出线上直播课,详细信息,请联系鲸小小 王老师 微信 techradio

鲸小小科技创客教育作为线下线上K12高端精品科技教育品牌,以有料、有趣,有爱,并且融合国际标准的课程为核心,赋予孩子充满热情地探索和实践的机会,培养孩子不断地学习包括编程在内的科技知识,在项目导向的教学活动中培养未来需要的关键技能,逐步提高孩子的综合素质。通过线下游戏化的运营方式,高水平的国际合作项目,让学生学以致用,展现创造力。
http://kids.abakus.cn
今天是第一部分: 你喜欢玩数独吗?

你喜欢玩数独吗?

数独是一种智力游戏。有时候外出旅行的时候, 我会看到有旅客左手握一本厚厚的布满格子的书,右手捏着一支秃了头的铅笔,一有机会就皱着眉头往书上划几个数字,填满了空格就高兴地咧咧嘴笑笑。他们在做什么呢? 一般来说,他们在玩数独游戏。
数独是一种风靡全球的智力游戏,也称为Sudoku,Number Place。我们来看一下数独游戏的规则。


数独游戏的规则

数独游戏需要9×9的81个格子,9行9列的方阵。 出题目的时候,有的格子里面会有数字,有的格子是空的,像下面这个图。 玩家需要按照规则,把空格子中缺失的数字填上。 其规则主要有三条

空格中需要填写1到9这样的数字 ,并且需要满足下面的条件

  • 每一行都包含1,2,3,4,5,6,7,8,9
  • 每一列都包含1,2,3,4,5,6,7,8,9
  • 每3×3的方阵(如果所示) 都包含1,2,3,4,5,6,7,8,9

我们把上面所述的每一行,每一列,以及每一个3×3的方阵都统称为一个单元

一个单元中的格子互相之间称为同伴。 如下图, 由第一行第一列的4所决定的单元就包含了 第一行,第一列,和左上角的3×3的方阵。 考虑,考虑一个格子的单元,要考虑三个地方, 行,列和3×3方阵。

为了描述方便, 数独上每一个格子都有个编号, 从上到下,每一行分别用A,B,C,D,E,F,G,H,I l来表示, 从左到右,每一列分别用1,2,3,4,5,6,7,8,9来表示。 那么, 4所在的格子就是A1, 第一行5所在的格子就是A9. 最右下角的8所在的格子就是I8.

用这样的方法表示, A1 所有的同伴就是:

  • 1) A2, A3, A4, A5, A6, A7, A8, A9
  • 2) B1, C1, D1,E1,F1, G1,H1,I1
  • 3) B2, B3,C2, C3

那么数独的规则就可以简化成一句话: 1到9中任何一个数字都不能在同一个单元中出现两次,也就是说一个格子中的数字与其同伴中的数字是不同的。


单元和同伴的概念在解决数独的时候挺重要的,需要仔细理解了。

一个设计好的数独游戏只有唯一解。

为了加深理解,我们再举几个例子:
1 在上面的数独游戏中,第一行第三列的空格就不能填写7, 因为7 已经在该行中出现了,同时也在该列中出现了。 2. E4 只可能填 6,7,9,因为其它数字已经出现在了E4所在的单元中(行,列,3×3方阵)

手工解决数独的策略

解决一个数独问题,有很多种策略。一种策略是从数字开始找,比如先找所有给定的数字1,然后推断哪些空格处必须要填1. 另外的策略就是首先根据给定的数字,看一下某个空格中可能填的数字, 做一下标记,然后再根据其它信息,逐步地从这些候选数字中去除不可能的数字,最后剩下的唯一的数字就是答案。
其它信息从哪里来呢,就从数独的规则和单元信息。 空格子中需要填写1到9这样的数字 ,并且需要满足下面的条件

  • 每一行都包含1,2,3,4,5,6,7,8,9
  • 每一列都包含1,2,3,4,5,6,7,8,9
  • 每3×3的方阵(如果所示) 都包含1,2,3,4,5,6,7,8,9

扫描数字

根据1在一行一列中只能出现一次,上图中只要出现了1的行,或者列,其它空格处就不能放1了。 画红线标记一下, 我们发现X所在的3×3方阵中,除了X所在的空格,其它空格都不可能是1. 所以,X处必填1.

用同样的方法, 我们可以找到在X格所处的3X3方阵中,除了X所在的空格,其它处都不可能是1, 所以这个地方的X处必须填4.

在上图中, 中间一行只剩一个空格,只剩9这个数字没有在该行中出现,所以,该处就一定填9了。
解决了上面这些空格, 此数独游戏形成了下面的样子。

可以用同样的方式寻找其它的数字。


标记空格可选数字


每个空格的可选数字根据数独的规则是可以缩小范围的。 我们可以在空格处标记一下这些可选数字。这些标记可以帮助我们很快地定位一些唯一的数字,比如I7出只能填1, 那么I3处就只能填3了。 进而H1就必然是6, H3必然是1了。

通过上面扫描数字和标记空格可选数字这两种策略,我们可以解决一部分简单的数独游戏。 请大家登陆 http://cn.sudokupuzzle.org 选择一些数独游戏来试一下吧。

作业


从 http://cn.sudokupuzzle.org 选择三个简单的数独游戏,尝试用上面所学内容解决该游戏。

总结

在今天的文章中,我们介绍了

  1. 数独这个游戏和它的规则。 我们用字母和数字给每个格子做了标记。
  2. 一个格子同时处于三个单元中,行,列和3×3方阵。
  3. 单元中其它格子称为该格子的同伴, 一个格子的值不能和同伴的值一样
  4. 解决数独游戏,可以扫描数字,也可以标记格子的可能值,把可能值尽可能地减少,最终变成唯一。

用手工可以解决数独游戏,很多人热衷于此。那么怎么用Python来解数独呢? 接下来我们会先介绍一个数独在Python中的表示,然后介绍Python的基本语法,进而一步一步地写程序解决数独。
有的读者可能会担心有难度。 不用担心, 这一系列文章会从零开始介绍Python编程语言,真正地带你体会用程序解决实际问题的步骤,其中会涉及到基本的语法,算法的思路,面向对象的知识点。


感谢

本文参考了 http://www.sudokuessentials.com/how_to_play_sudoku.html 中的图片和内容。 有些图片是直接借用的,有的是修改了一下,向作者致谢。