【我的不正紧编程】数独之我见

  记得2012年5月左右,网上出现一条新闻,说是史上最难数独,然后有各种人各种方法将它解出来,虽然当时自己还在苦逼地跑客户,心里却想着如何快速的把它给解出来,但也停留在想想而已,后来工作一忙,又把这事给忘了。

  人生就是如此令人摸不着头脑。因为工作的不如意,脑袋一热,我竟离开了我两年的销售工作,幸好,荒废两年的技术并未让我流浪街头,顺利投身挨踢业。虽然壮志还在,但终究要面对现实。我的技术水准实在有点对不起新公司,所以,最近一段时间,我都处于学习过程中,于是乎,最近几天我又想起了那个牛逼哄哄的史上最难数独,那就编程实现吧,立志能解所有可解之数独,权当我新语言java的练笔之作。

  言归正传,接下来就是我的一些想法及代码(貌似引言有点罗嗦,不知不觉就写多了 - -!):  

  数独的每一个单元格的值都有九种可能:1~9。每一行,每一列中的数字彼此不重复。数独又可视为九个3×3的九宫格组成,九宫格中的数字也彼此不重复。  

  解数独的逻辑基础就是:1)单个单元格数字的唯一性。 2) 所在行,所在列,所在九宫格的数字彼此不重复。利用编程实现解数独的思路:1) 单元格通过自身获取信息推算出自身单元格的唯一值。 2)单元格根据周边信息(行、列、九宫格)的信息推算出自身单元格的值。 

  这里需要对信息做一下说明:

    1) 定义:某个单元格不是某个数字的确定性。

    2) 信息的获取:假设某个单元格数字确定为number,则该单元格所在的行,列,九宫格的其它单元格的值都确定不是number 

  理解了信息的概念,可以进一步对我的编程思路做一下举例说明:

    1)  当某个单元格获取足够信息(比如自身确定不是1~8),则可以确定自身的值(自己必定是9)

    2)  当单元格所在行的其它单元格都有信息我不是9”,由于该行的数字不重复性,推出该行必须存在数字9,所以确定该单元格必定是数字9。对于列以及九宫格的情况同样如此。    

    3)  多次循环调用1) 2)步骤,直至无新解。 然后遍历未解之单元格,找出信息最多的单元格进行试错(比如某个单元格的信息告诉我们它只能是9或者8,那么我就试错8),这里就可以用回溯法啦。

(未完,待续)

 

posted @ 2013-01-13 22:09  lovememo  阅读(270)  评论(0编辑  收藏  举报