转载自:https://mp.weixin.qq.com/s/NE4j2Jc0vzw9pr2w4BF7hg
我们先了解一下什么是数独
数独(shù dú)是源自18世纪瑞士的一种数学游戏。它是一种运用纸、笔进行演算的逻辑游戏。数独有多种类型,我们仅以其中一种类型作为本文实例。
玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。
方格
水平方向有九横行,垂直方向有九纵列的矩形,画分八十一个小正方形,称为九宫格(Grid),如图一所示,是数独(Sudoku)的作用范围。

行:水平方向的每一横行有九格,每一横行称为行(Row)

列:垂直方向的每一纵列有九格,每一纵列称为列(Column)
![]()
宫:三行与三列相交之处有九格,每一单元称为小九宫(Box、Block),简称宫,如图四所示(在杀手数独中,宫往往用单词Nonet表示)

上述行、列、宫、单元格统称为单元(Unit);而行、列、宫统称为区域(Region)。
区块
由三个连续宫组成大行列(Chute),分大行(Floor)及大列(Tower)。
第一大行:由第一宫、第二宫、第三宫组成。
第二大行:由第四宫、第五宫、第六宫组成。
第三大行:由第七宫、第八宫、第九宫组成。
第一大列:由第一宫、第四宫、第七宫组成。
第二大列:由第二宫、第五宫、第八宫组成。
第三大列:由第三宫、第六宫、第九宫组成。
格位编号
坐标有多种标示法,有横行 A~I,纵列 1~9(如中国),也有横行 1~9,纵列 A~I(如日本),这两种标示容易混淆,故最被广泛使用的是横行R1~R9,纵列C1~C9的标示法。
提示数:在九宫格的格位填上一些数字,做为填数判断的线索(Hint),称为提示数(Clue)

通常人工解决数独的思路
1、依解题填制的过程可区分为直观法与候选数法。
直观法就是不做任何记号,直接从数独的盘势观察线索,推论答案的方法。
2、候选数法就是排除行列宫格位已出现的数字,将剩余可填数字填入空格,做为解题线索的参考,可填数字称为候选数(Candidates,或称备选数)。
直观法和候选数法只是填制时候是否有注记的区别,依照个人习惯而定,并非鉴定题目难度或技巧难度的标准,无论是难题或是简单题都可上述方法填制,一般程序解题以候选数法较多。
数独的Prolog程序
有效的数独板核心程序可以简明地表示如下:
1 : sudoku(Rows) :-
2 : length(Rows, 9),
3 : maplist(same_length(Rows), Rows),
4 : append(Rows, Vs), %Rows列表里元素也是表
5 : Vs ins 1..9, %Vs的取值范围是0~9之间
6 : maplist(all_distinct, Rows), %每行的元素都不重复
7 : transpose(Rows, Columns),
8 : maplist(all_distinct, Columns), %每列的元素都不重复
9 :

本文介绍了如何使用Prolog编程解决数独问题。通过理解数独规则,定义程序实现有效的数独板,并通过示例解释了程序的运行过程,展示了Prolog在逻辑编程上的简洁和高效。

323

被折叠的 条评论
为什么被折叠?



