数独问题

这个问题答案不唯一。如何求所有的答案?

论新闻记者的理科修养

有了解数独的代码,就想找一些真的问题来练习。

n×n n\times n的数独问题,对于非常大的 n n 的数独问题目前虽然没有好的计算机或非计算机解法, 但是 对于 9×99\times 9 的民间常玩数独还是可以穷举秒解的。

比如,上面的数独问题用 Mathematica 在代码使用正确的情况下,列出所有解,用 i7 K4770 CPU之类的电脑,通常在200秒以内必然能完成。

可能这个问题不够难,于是,尝试搜索 最难 数独 之类的关键词。找到的是一则2013年前后的新闻。说是芬兰某 数学家 用三个月设计出一个号称世界最难的,只有唯一答案的常规数独问题,重庆一位副教授用15天,而江苏一位农民爱好者用3天解出。但是两者的答案不一样。

我验证了下这个问题,记者的专业修养真的是太文科生了。

http://www.sudokufans.org.cn/forums/topic/438/#entry2983

我没有查芬兰某人的身份背景,因为这个并不关键。但是说数独最难必然不是数学家。数学家应该有常识,这类数独问题根本算不上什么问题,更何谈世界最难?难度其实也缺乏一个客观的度量标准。

其次,这类问题的解是不是唯一,用计算机恰当的算法和代码可以10分钟之内必然能穷举出来而验证。那个问题的确是有唯一解的。记者说某网友编程序用24小时,只能说记者的网友代码或算法比较笨而已,并不能说明一般的设计良好的算法求解这类问题的效率。但是这居然也成为一个炒作要点。

从图片看出,重庆的副教授的答案是正确的。这个根本就不意外。记者居然把江苏老农的错误的解答大肆宣扬,还由此否认原始问题解的唯一性,简直是脑残到家。

这不只是专业素质问题,简直是道德品质问题了:为了制造新闻卖点,故意夸大原始问题作者身份及其问题难度,然后拉低江苏老农的身份,并把后者的错误答案当成正确答案来宣传。

一些答案

这里的答案,实际上是算法搜索到的可能的全部答案。
所以,不要尝试人工找其它答案了。

代码:

ColumnQ[l_List]:= And @@MapThread[Unequal,l]
SubMatQ[l_List]:=And @@ (Unequal[Sequence @@ #]& /@ Partition[Flatten[Partition[l,{3,3}]],9])
SubMatPartialQ[l_List,Positions_List]:= SubMatQ @ Join[l,Take[Positions,Length[l]-9]]
genRow[l_List, OneToNine_List]:=
Module[
{nz,cmp,perms},
(* Find the values and locations of the given elements *)
nz = Select[Thread[{l,OneToNine}],#[[1]]>0 &];
(* Find the numbers from 1 to 9 which aren't specified *)
cmp = Complement[OneToNine,nz[[All,1]]];
(* Find the permutations of the numbers not specified *)
perms = Permutations[cmp];
(* Insert the specified numbers back in  *)
Fold[Insert[#1,Sequence @@ #2]&,#,nz]& /@perms
]TestQ[n_, GivenAndPositions_List]:= (ColumnQ[#]&& SubMatQ[#])& @  ReplacePart[GivenAndPositions, n-> #]&
Function To Build the Solution Using Backtrack
<<Combinatorica`
BacktrackSolve[GivenValues_List]:=
Module[
{OneToNine = Range[9],Positions,InitialSampleSpace, GivenAndPositions, SampleSpace},
Positions = Outer[Plus, 10*OneToNine,OneToNine];
InitialSampleSpace = genRow[#,OneToNine]& /@ GivenValues;
GivenAndPositions = MapThread[If[#1 ==0,#2,#1]&,{GivenValues,Positions},2];
SampleSpace = Table[Select[InitialSampleSpace[[i]],TestQ[i,GivenAndPositions]],{i,9}];
Backtrack[SampleSpace,(ColumnQ[#] && SubMatPartialQ[#,Positions])&,(ColumnQ[#] && SubMatQ[#])&]
]myJoin[l1_List, l2_List]:=
If[Length[Dimensions[l1]]==1,Join[{l1},{l2}],Join[l1,{l2}]]
myOuter[l1_List, l2_List,Positions_List]:= Select[Flatten[Outer[myJoin,l1,l2,1],1],(ColumnQ[#] && SubMatPartialQ[#,Positions])&]
OuterSolve[GivenValues_List]:=
Module[
{OneToNine = Range[9],Positions,InitialSampleSpace, GivenAndPositions,SampleSpace},
Positions = Outer[Plus, 10*OneToNine,OneToNine];
InitialSampleSpace = genRow[#,OneToNine]& /@ GivenValues;
GivenAndPositions = MapThread[If[#1 ==0,#2,#1]&,{GivenValues,Positions},2];
SampleSpace = Table[Select[InitialSampleSpace[[i]],TestQ[i,GivenAndPositions]],{i,9}];
Fold[myOuter[#1,#2,Positions]&,First[SampleSpace],Rest[SampleSpace]]
]AbsoluteTiming[MatrixForm /@ OuterSolve[(ToExpression@(Partition[#, 9] &@Characters@"0810000309000057000000000080000570000000409000501000600080000\
00016300000400070200"))]]ConvertString[l_List] := ToExpression[Characters /@ l]
t1str = {"090100500", "000079801", "200005006", "030000700", "000781000", "004000020", "700600004", "601530000", "009007060"};MatrixForm[t1 = ConvertString[t1str]]AbsoluteTiming[MatrixForm[BacktrackSolve[t1]]]
AbsoluteTiming[MatrixForm /@ OuterSolve[t1]]

一个答案不唯一的数独问题相关推荐

  1. 单例模式(全局地提供了一个类的唯一对象,该类的对象只创建一次,避免了创建类对象的开销)

    单例模式全局地提供了一个类的唯一对象,而且类的对象只需要创建一次,避免了创建类的对象开销 代码 single.h #ifndef HEADFILE #define HEADFILE#include & ...

  2. 找出一个数组中唯一一个出现2次的数字

    找出一个数组中唯一一个出现2次的数字,不清楚是不是LeetCode上的题.本人默认是LeetCode上的题. 一个数组中有N个数字,但是只有一个数字出现了2次,其他的数字均不相同.这种问题一般应该采用 ...

  3. 数据库添加一个列的唯一约束

    数据库添加一个列的唯一约束 有个小需求,在数据库中存在的列中添加一个唯一约束.记录下来,留做备忘.对ExternalConfirmNo字段约束. ALTER TABLE [ChannelExterna ...

  4. 百度知道回答html代码,html - JavaScript面试题:页面编码和被请求的资源编码 ,如果不一致,如何处理?百度上搜到一个答案,不知道是否正确?...

    js编码和页面编码不一致,导致提示变量未定义的解决方法 (2011-06-30 10:27:02)转载▼ 标签: js跨域 变量未定义 js编码 it 分类: JS 今天在测试项目的时候,由于是和其他 ...

  5. 烤仔创作者联盟 | NFT是市场的下一个答案?或迎来新一轮“造福潮”

    # 烤仔创作者联盟 由 Conflux 社区小伙伴们组织成立的"烤仔创作者联盟"是一个专注文学创作的非官方组织.联盟志在深耕原创内容,让优质的内容和专栏作者受到关注,让每一位原创者 ...

  6. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使用两遍. ...

  7. 阿里极客公益——1000+阿里技术专家来回答你的问题或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里1000+位技术专家来云栖问答为你解答技

    原文链接:点击打开链接 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里1000+位技术专家来云栖问答为你解答技术难题了 他们用户自己手中的技术来 ...

  8. 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可

    这是一个很好的算法 在leetcode 也曾出现,今天我们详细分析一下: 题目简介: /*** 请你判断一个 9 x 9 的数独是否有效.只需要 根据以下规则 ,验证已经填入的数字是否有效即可.** ...

  9. 为智能世界“高”歌:HEIGHT,五种风景,一个答案

    1764年,从英国到普鲁士,从法国到西班牙,欧洲处在各种各样的纷争与问题当中,没有人会想到,这一年工业革命正式开始,人类迎来了史无前例的飞速发展. 上世纪80年代末,冷战疑云漫天,全球处在深刻的猜疑与 ...

最新文章

  1. 量子通信产业化初试,中国筹建千亿级国家实验室
  2. 趁有空,再了解一下GROOVY中关于类的通例
  3. IDAE启动报错:Intellij idea Cannot start internal HTTP server. Git integration, JavaScript debugger...
  4. 顺序表的动态存储细节
  5. mx350显卡天梯图_2019.8月CPU和显卡性能天梯图
  6. 深度学习-图像数据标注工具使用(LabelImg和BBox)
  7. TalkingData
  8. MySQL中的自增主键用完了怎么办?
  9. java钢铁之心,洛克人 Dash 2 EPISODE 2(第二部) - 巨大的遗产[日]下载
  10. HNOI2004 宠物收养所
  11. 天梯赛HBU训练营——链表去重 (25分)(测试点2和段错误解决)
  12. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息
  13. 玫瑰花html有颜色的,玫瑰花有哪些颜色
  14. java ssi_快速部署SSI框架
  15. ceph---luminous版的安装
  16. oracle交换分区转移数据,oracle 分区交换-归档数据
  17. 微信小程序内七牛云图片显示异常
  18. Mysql查询时间数据
  19. 基于L2,1范数的特征选择方法
  20. 基于LabVIEW的汽车仪表步进电机测试系统ETest

热门文章

  1. 极简Git+VSCode(Mac)
  2. 一台电脑一天用多少度电
  3. 地下城守护者2 无限魔法修改器
  4. [附源码]JSP+ssm计算机毕业设计大学生收书系统j7k68【源码、数据库、LW、部署】
  5. python中的编码方式
  6. rabbitmq的启动命令
  7. 说说字符流中flush()和close()的区别
  8. Android Open Source:陌陌(momo)源代码及实现(大部分UI+功能)
  9. python读啥-python怎么读,python是什么意思
  10. vat可以退税吗_VAT退税如何退?