COMP9021 Principles of Programming WEEK9_Optional

1. Assignment2 Sudoku Explanation

数独规则简述:每行、每列、每个九宫格都由1-9构成,不能有数字重复。
解法思路简述:根据不重复的规则找到forced cell solution,再标记每个cell的possible solution,然后根据preemptive set来进一步确认剩余cell的解法。通常无法准确判断每一个cell的确定解,有一些cell必须要guess,这个时候要mark好当前的status,如果猜测不对,则要回到当前的status。

1.1 preassess()

初筛输入grid是否符合要求,检查:
(1)是否是9*9的table;
(2)所有元素是否是0-9的integer;
(3)每行、每列、每个九宫格没有digit repetition

1.2 bare_tex_output()

根据latex语法输出可供简洁查看的数独代码。包括不需要调整的主体代码部分:

\documentclass[10pt]{article}
\usepackage[left=0pt,right=0pt]{geometry}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{cancel}
\pagestyle{empty}

\newcommand{\N}[5]{\tikz{\node[label=above left:{\tiny #1},
                               label=above right:{\tiny #2},
                               label=below left:{\tiny #3},
                               label=below right:{\tiny #4}]{#5};}}

\begin{document}

\tikzset{every node/.style={minimum size=.5cm}}

\begin{center}
\begin{tabular}{||@{}c@{}|@{}c@{}|@{}c@{}||@{}c@{}|@{}c@{}|@{}c@{}||@{}c@{}|@{}c@{}|@{}c@{}||}\hline\hline

\end{tabular}
\end{center}

\end{document}

需要调整的代码含义如下:

\N{}{}{}{}{} & \N{}{}{}{}{} & \N{}{}{}{}{1} &
\N{}{}{}{}{9} & \N{}{}{}{}{} & \N{}{}{}{}{} &
\N{}{}{}{}{} & \N{}{}{}{}{} & \N{}{}{}{}{8} \\ \hline
#每条line的代码需要调整,调整部分是{}中的内容。
#\N{}{}{}{}{9}为例,第1个{}代表cell左上的mark内容,第2个{}代表cell右上的mark内容,第3个{}代表cell左下的mark内容,第4个{}代表cell右下的mark内容,第5个{}代表cell正确的数字(这里是9)

mark删除value的写法如下:

{\cancel{7} \cancel{8}}
#前述第N个{}的输出写法,含义是删除7和8

1.3 forced_tex_output()

根据规则和latex代码含义输出所有能确定数字的cell值,使用latex格式输出。

1.4 marked_tex_output()

除了所有确定值cell的输出外,不能确定数值的cell有显示所有的possible values。
第1个{}存储1,2;
第2个{}存储3,4;
第3个{}存储5,6;
第4个{}存储7,8,9;

1.5 worked_tex_output()

使用preemptive set方法输出sudo的解。

2. Preemptive Set

假设在一行中有3个cell的数字不能确定,他们的possible values分别是{1,2,3}, {1,2}, {1,3}。
这说明这3个cell必须填充1,2,3这三个数字,他们组成了一个preemptive set。
用法是,如果在同一行另一个cell是{1, 5, 6}那么可以在这个cell中划去1,剩下{5, 6}。
该方法可以在每行、每列、每个九宫格中都使用,从而缩小possible values以最大程度接近最终解。

2.1 Combination判断Preemptive Set

找到包含所有元素的cell,根据这个cell可以列举所有的组合可能,再判断后续cell是否与之形成preemptive set。

from itertools import combinations
list(combinations([2, 3, 4], 2))
>>>
[(2, 3), (2, 4), (3, 4)]

2.2 二进制判断Preemptive Set

combination的方式效率不高,可以用二进制的思路提高效率。本质问题是判断两个集合是否有子集关系,假设:
x = {1, 3}
y = {1, 3, 5}
假设一个10位的二进制数,每一位都代表对应位置的数字,例如10代表1,100代表2,1000代表3。这样可以用一个二进制来表示一个上述的集合,x表示为1010,y表示为101010。
接下来判断子集关系是否成立,方法是这样的二进制的每一位上x | y == y,如果为True则x是y的子集,反之。
(1)集合转换为二进制表达的十进制操作方法:

s = {1, 4, 6} 
x = 0
for e in s:
   x |= 1 << (e - 1) 
f'{x:09b}'
>>>
'000101001'

(2)二进制表达的十进制数转换为集合的方法:

def convert_number_to_set(x):
    S = set()
    n = 1
    while x:
        if x & 1:
            S.add(n)
        x >>= 1
        n += 1
    return S

convert_number_to_set(41)

上述代码实现过程解释如下:

41的二进制表达是x = 101001
assign n = 1
进入while循环,x为True
进入if判断x & 1,x最后一位是1,x&1为True
s = {1}
接下来右移1位,二进制表达是x = 10100
n = 2
x = 1010
n = 3
x = 101
n = 4
x & 1 True
s = {1, 4}
x = 10
n = 5
x = 1
n = 6
x & 1 True
s = {1, 4, 6}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • (转载者)【逻辑引擎】简序:虽然关于超限数的一些理论(特别是大基数)遭到某些直觉主义者或构造主义者的诟病,但对我个...
    guozhao1985阅读 834评论 0 1
  • 一、实验目的 学习使用 weka 中的常用分类器,完成数据分类任务。 二、实验内容 了解 weka 中 explo...
    yigoh阅读 8,433评论 5 4
  • 烟花绽放虽然绚烂夺目,但是使命也短暂,一闪而逝,只留下无边灰暗的天空,和燃烧后的灰烬。烟花如此,那人呢……有的女子...
    茹舞阅读 1,432评论 4 3
  • 一.乾为天 乾九金,乾九金.二金比和,田产兴发,家富殷实;但二公同室,纯阳无阴,伤妻克子,妻妾重娶,长房子孙不和....
    詠四阅读 9,903评论 0 1