是不是所有的数独高级解法 逻辑链题是只用逻辑推理即可完成,还是要猜

学军中学金策同学获世界数独锦标赛个人冠军
  日 09:03:01 星期五 来源:
第八届世界数独锦标赛上,金策喜获个人冠军。
总决赛题目
昨天,学军中学的老师打来电话:我们学校高一的金策同学最近参加了第八届世界数独锦标赛,获得个人总冠军和18岁及以下年龄组冠军,小小年纪就成了世界冠军,很厉害!
数独是一种需要运用纸笔进行演算的逻辑游戏,起源于18世纪末的瑞士,后来在美国发展得很快,近几年在日本发展到顶峰。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线“宫”内的数字均含1-9且不重复,对玩家的观察力、判断力、反应速度和思维能力都有要求,还蕴含着很多数学方法。
昨天中午,我们在学军中学见到了这位年轻的世界冠军——金策同学。金同学个子很高,大约一米八,看起来很腼腆,站在班主任身后。
金策的爸爸这次全程陪同儿子参加比赛。他介绍,第八届世界数独锦标赛设置了四个奖项,分别是个人冠军,团体冠军,18岁及以下年龄组冠军,50岁以上年龄组冠军共四个。这次除了50岁以上年龄组比赛,其它项目金策都拿到了奖牌。
去年第十、今年第一
这次比赛在北京举行。金策说,他今年刚上高一,需要尽快适应高中生活,所以赛前没有太多的时间研究数独,去北京前心里没底。
去年金策代表中国队去克罗地亚参加过第七届世界数独锦标赛,成绩是个人组第十名,作为第一次参加世界级比赛的选手,这个成绩已经很不错了。
在去年和今年的中国数独锦标赛中,金策两次拿到冠军,引起了一些轰动。
金策说,这次的个人比赛竞争很激烈。35个国家的164名选手全部参加预赛,比赛第一天和第二天上午,一共有十一轮比赛(其中八轮个人赛,三轮团体赛),总分前十的进入半决赛。
半决赛的比赛形式很有意思,比赛场地共设置了九排座位,从后往前座位依次减少。选手们先在最后一排,通过答题“通关”,依次往前排移,每一次前移都会淘汰几位选手。金策说:“这样的形式对选手要求很高,不但要求正确率,还要求反应速度,如果慢了一拍,前面的座位坐满了,就算题目答对了也会被淘汰。”
“半决赛进行了大约一个半小时。到总决赛时,只剩下我和另外一位日本选手,要进行两个人的对决。他比我提前抢到总决赛名额,我很紧张。这位日本选手是老手了,他正在上东京大学,玩数独的时间也比我长,在去年的世锦赛上,他是亚军,把我远远甩在后头,我觉得不可能战胜他。”
金策爸爸全程观摩了总决赛,他说,一对一较量时,气氛相当紧张。金策与日本选手森西亨泰站在赛台两边,背对面积一平方米左右的题板。工作人员将题贴好后,裁判喊“3、2、1,开始”,两人迅速转身,当众解题。在5题3胜的决赛中,两人战至决胜题,金策仅领先2.3秒获胜。
学数独训练逻辑能力
现在有些小学数学老师会让学生做数独题,说是可以提高逻辑能力。
金策说,小时候他就很喜欢数学,兴趣班也学过奥数。在逻辑推理、反应速度和快速判断等方面,奥数和数独有相通之处,互有帮助。其实做数独题就是一个推理的过程,数学学习中很重要的两个能力是猜想和推理,数独题目做得多对数学学习应该有帮助。
一般人接触的数独不会很复杂,它的推理过程主要有两种,一种是尝试、验证、成功;还有一种是尝试、验证、推翻、再验证。举个例子,推理后发现一个格子中只能填4或5中的其中一个数字,但不知道是哪一个,可以先代入一个,做到后来可能会发现矛盾,这时候再重新来过,这就是假设和尝试的过程。
数独对几何中的空间观念可能不会有太大帮助,但数学永远离不开推理,训练数独对解题的思路和方法还是有一些作用的。
金策说,参加这次比赛的选手大部分是年轻人。中国队的四位选手中,有两位选手分别来自北大附中和人大附中,还有一位三十多岁的爸爸,经验很丰富。其它国家队以成人为主,大学生比较多,水平比较高的有日本、韩国以及一些东欧国家。
原标题: 学军中学金策同学获世界数独锦标赛个人冠军
作者:记者 姜晓蓉 网络编辑:丁丽
版权和免责声明:
  ①凡本网注明“稿件来源:桐庐新闻网”的所有文字、图片和音视频稿件,版权均属桐庐新闻网所有,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发表。已经本网协议授权的媒体、网站,在下载使用时必须注明“稿件来源:桐庐新闻网”,违者本网将追究其相关法律责任。
  ②凡本网注明“来源:XXX(非桐庐新闻网)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
  ③ 如因作品内容、版权和其它问题需要同本网联系的,请在30日内进行。联系电话:4。
浙新办〔2004〕41号 广告经营许可证:杭工商桐广许2008001号 浙ICP备号
| 广告电话:4  网络部:&&&&数独2000题
自营订单满39元(含)免运费
不足金额订单收取运费5元起
邀请好友参加吧
版 次:1页 数:字 数:印刷时间:日开 本:12k纸 张:胶版纸印 次:1包 装:平装是否套装:否国际标准书号ISBN:9所属分类:&&&
下载免费当当读书APP
下载当当读书APP,免费阅读万本电子书。
本商品暂无详情。君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
数独问题 数学建模.doc
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口求一个能随机产生数独的源码
Description of your first forum.
27 篇帖子 & 分页:2 / 2 &
由 yxgszm & 星期六, 日 08:56
难道是分数不够?没人关注么?
由 LeeChange & 星期六, 日 09:14
生成容易,怎么判断难度值.
由 yxgszm & 星期六, 日 09:15
考虑留下的空格数吧38-40 一般40-42 中等42-45 高级
由 xingxin00 & 星期六, 日 09:52
没研究过,帮你顶一下,有了结果告诉一下,
由 yxgszm & 星期六, 日 13:00
在线等啊,分数不够,我在另开贴送分啊!!!!!!!
由 yxgszm & 星期六, 日 17:47
[B)][B)][B)][B)][B)][B)][B)][B)][B)][B)]
由 yxgszm & 星期六, 日 18:10
朋友写了个C++的,哪位高手帮我转化成delphi 的嘛,一样给分哈Demo请发送到 谢谢源码如下:#ifndef SUDOKU_RICK_0701_#define SUDOKU_RICK_0701_class CSudoku{&int map[9][9];&&&int check(int,int,int*);&void dfs();public:&enum{ANY=0,ALL=1};&CSudoku(int n=40);// 随机生成数独,n越大越难&CSudoku(int *data);// 人工指定数独&virtual ~CSudoku();&void display();// 显示数独&int resolve(int mod=ALL);// 解数独};#endif#include "sudoku.h"#include "stdio.h"#include "stdlib.h"#include "time.h"CSudoku::CSudoku(int n){&int i,j;&srand(time(0));&do&{& for(i=0;i&9;++i)& {& &for(j=0;j&9;++j)& & map[i][j]=0;& &j=rand()%9;& &map[i][j]=i+1;& }&}&while(!resolve(ANY));&// 挖窟窿&for(int k=0;k&n;)&{& i=rand()%81;& j=i%9;& i=i/9;& if(map[i][j]&0)& {& &map[i][j]=0;& &++k;& }&}&//printf("(randomized sudoku created with %d blanks.)\n",blanks);}CSudoku::CSudoku(int *data){&int *pm=(int*)&for(int i=0;i&81;++i)& pm[i]=data[i];}CSudoku::~CSudoku(){&}void CSudoku::display(){&for(int i=0;i&9;++i)&{& for(int j=0;j&9;++j)& {& &if(map[i][j]&0)& & printf("& %d & &",map[i][j]);& &else& & printf("[ & ] &");& }& printf("\n");&}}int CSudoku::resolve(int mod){&smod=&if(mod==ALL)&{& solves=0;& dfs();&&}&else if(mod==ANY)&{& try& {& &dfs();& &return 0;& }& catch(int)& {& &return 1;& }&}&return 0;}int CSudoku::check(int y,int x,int *mark){&int i,j,is,js,count=0;&for(i=1;i&=9;++i)& mark[i]=0;&for(i=0;i&9;++i)& mark[map[y][i]]=1;&for(i=0;i&9;++i)& mark[map[i][x]]=1;&is=y/3*3;&js=x/3*3;&for(i=0;i&3;++i)&{& for(j=0;j&3;++j)& &mark[map[is+i][js+j]]=1;&}&for(i=1;i&=9;++i)& if(mark[i]==0)& &count++;&}void CSudoku::dfs(){&int i,j,im=-1,jm,min=10;&int mark[10];&for(i=0;i&9;++i)&{& for(j=0;j&9;++j)& {& &if(map[i][j])& && &int c=check(i,j,mark);& &if(c==0)& && &if(c&min)& &{& & im=i;& & jm=j;& & min=c;& &}& }&}&if(im==-1)&{& if(smod==ALL)& {& &printf("No. %d:\n",++solves);& &display();& && }& else if(smod==ANY)& {& &throw(1);& }&}&check(im,jm,mark);&for(i=1;i&=9;++i)&{& if(mark[i]==0)& {& &map[im][jm]=i;& &dfs();& }&}&map[im][jm]=0;}#include &iostream&#include "sudoku.h"int main(){&int data1[]=&{4,9,0,0,0,6,0,2,7,& 5,0,0,0,1,0,0,0,4,& 6,0,0,0,0,8,0,0,3,& 1,0,4,0,0,0,0,0,0,& 0,6,0,0,0,0,0,5,0,& 0,0,0,0,0,0,2,0,8,& 7,0,0,2,0,0,0,0,5,& 8,0,0,0,9,0,0,0,1,& 3,4,0,5,0,0,0,6,2&};&int data2[]=&{7,4,0,0,8,0,0,1,6,& 9,0,0,0,3,5,0,0,4,& 0,0,0,7,0,0,0,0,0,& 0,7,0,0,0,9,5,0,0,& 6,1,0,0,5,0,0,8,7,& 0,0,2,6,0,0,0,4,0,& 0,0,0,0,0,4,0,0,0,& 3,0,0,5,6,0,0,0,2,& 5,6,0,0,1,0,0,3,9&};&&cout&&"随机生成一个数独,输入空格数";&cin&&&CSudoku s(blanks);&s.display();&cout&&"开始解数独:"&&&s.resolve();&return 0;}测试运行结果:随机生成一个数独,输入空格数40[ & ] && 7 & && 8 & &[ & ] &[ & ] &[ & ] &[ & ] &[ & ] && 6 && 6 & && 3 & &[ & ] && 7 & &[ & ] && 2 & && 8 & &[ & ] && 5 && 2 & &[ & ] &[ & ] && 8 & &[ & ] &[ & ] &[ & ] &[ & ] && 9 && 3 & && 9 & &[ & ] && 1 & &[ & ] &[ & ] && 2 & && 5 & &[ & ][ & ] &[ & ] &[ & ] && 2 & && 5 & && 4 & && 6 & &[ & ] && 3 && 4 & &[ & ] &[ & ] &[ & ] &[ & ] &[ & ] && 7 & && 1 & &[ & ][ & ] &[ & ] &[ & ] && 4 & && 7 & &[ & ] &[ & ] && 3 & && 1 && 9 & && 4 & &[ & ] && 6 & && 2 & && 1 & && 5 & && 8 & &[ & ][ & ] &[ & ] && 7 & && 9 & && 3 & &[ & ] &[ & ] && 6 & && 2 &开始解数独:No. 1:& 1 & && 7 & && 8 & && 5 & && 4 & && 9 & && 3 & && 2 & && 6 && 6 & && 3 & && 9 & && 7 & && 1 & && 2 & && 8 & && 4 & && 5 && 2 & && 5 & && 4 & && 8 & && 6 & && 3 & && 1 & && 7 & && 9 && 3 & && 9 & && 6 & && 1 & && 8 & && 7 & && 2 & && 5 & && 4 && 7 & && 8 & && 1 & && 2 & && 5 & && 4 & && 6 & && 9 & && 3 && 4 & && 2 & && 5 & && 3 & && 9 & && 6 & && 7 & && 1 & && 8 && 5 & && 6 & && 2 & && 4 & && 7 & && 8 & && 9 & && 3 & && 1 && 9 & && 4 & && 3 & && 6 & && 2 & && 1 & && 5 & && 8 & && 7 && 8 & && 1 & && 7 & && 9 & && 3 & && 5 & && 4 & && 6 & && 2 &No. 2:& 1 & && 7 & && 8 & && 5 & && 4 & && 9 & && 3 & && 2 & && 6 && 6 & && 3 & && 9 & && 7 & && 1 & && 2 & && 8 & && 4 & && 5 && 2 & && 5 & && 4 & && 8 & && 6 & && 3 & && 1 & && 7 & && 9 && 3 & && 9 & && 6 & && 1 & && 8 & && 7 & && 2 & && 5 & && 4 && 7 & && 8 & && 1 & && 2 & && 5 & && 4 & && 6 & && 9 & && 3 && 4 & && 2 & && 5 & && 3 & && 9 & && 6 & && 7 & && 1 & && 8 && 8 & && 6 & && 2 & && 4 & && 7 & && 5 & && 9 & && 3 & && 1 && 9 & && 4 & && 3 & && 6 & && 2 & && 1 & && 5 & && 8 & && 7 && 5 & && 1 & && 7 & && 9 & && 3 & && 8 & && 4 & && 6 & && 2 &Press any key to continue
由 LeeChange & 星期六, 日 21:56
“生成容易,怎么判断难度值.”先为我说这句话的冒失向楼主道歉。以下是我写的代码,能够按规则随机生成数独,但仅仅是能够而已。program Project2;{$APPTYPE CONSOLE}type& TArr33 = array [0..2, 0..2] of B& TArr99 = array [0..8, 0..8] of Bvar& Square: TArr99;& i: I& Blank: Iprocedure Print(const A: TArr99);var& i, j: Ibegin& for i:=0 to 8 do& begin& & for j:=0 to 8 do& & & if A[i, j]&0 then& & & & Write(A[i, j]: 2)& & & else& & & & Write('_':2);& & WriteLn& endprocedure RandomFill(var A: TArr33);var& t: array [0..8] of I& Len: I& i, j, k: Ibegin& for i:=0 to 8 do& & t[i]:=i+1;& Len:=9;& for i:=0 to 2 do& & for j:=0 to 2 do& & begin& & & k:=Random(Len);& & & A[i, j]:=t[k];& & & t[k]:=t[Len-1];& & & Dec(Len)& & endprocedure Init(var A: TArr99);var& Temp: TArr33;& i, j, k, l: Ibegin& for i:=0 to 2 do& & for j:=0 to 2 do& & begin& & & RandomFill(Temp);& & & for k:=0 to 2 do& & & & for l:=0 to 2 do& & & & & A[i*3+k, j*3+l]:=Temp[k, l]& & endfunction RegulateRow(var A: TArr99; const Index: Integer): Ivar& i, j, k: I& t: array [1..9] of array of Ibegin& Result:=0;& for i:=1 to 9 do& & SetLength(t[i], 0);& for i:=0 to 8 do& & if A[Index, i]&&0 then& & begin& & & SetLength(t[A[Index, i]], Length(t[A[Index, i]])+1);& & & t[A[Index, i], Length(t[A[Index, i]])-1]:=i& && for i:=1 to 9 do& & if Length(t[i])&1 then& & begin& & & k:=Random(Length(t[i]));& & & for j:=0 to Length(t[i])-1 do& & & & if j&&k then& & & & begin& & & & & A[Index, t[i, j]]:=0;& & & & & Inc(Result)& & & & end& & endfunction RegulateCol(var A: TArr99; const Index: Integer): Ivar& i, j, k: I& t: array [1..9] of array of Ibegin& Result:=0;& for i:=1 to 9 do& & SetLength(t[i], 0);& for i:=0 to 8 do& & if A[i, Index]&&0 then& & begin& & & SetLength(t[A[i, Index]], Length(t[A[i, Index]])+1);& & & t[A[i, Index], Length(t[A[i, Index]])-1]:=i& && for i:=1 to 9 do& & if Length(t[i])&1 then& & begin& & & k:=Random(Length(t[i]));& & & for j:=0 to Length(t[i])-1 do& & & & if j&&k then& & & & begin& & & & & A[t[i, j], Index]:=0;& & & & & Inc(Result)& & & & end& & endbegin& R& Init(Square);& Blank:=0;& for i:=0 to 8 do& begin& & Blank:=Blank+RegulateRow(Square, i);& & Blank:=Blank+RegulateCol(Square, i)&& Print(Square);& WriteLn('Blank=', Blank);& ReadLnend.但是,俺后来深入看了一下数独的一些网站,一个成功的数独题要满足以下几个条件:1.有且仅有一组解2.求解过程中每个数字都必须是通过逻辑推理填进去的,不能有任何猜测或代入的操作3.日系数独题还强调点对称这段代码没有一点能满足,因此设计“成功”的数独题是个小概率事件。
由 LeeChange & 星期六, 日 22:08
后来俺就想了,要保证出的题目有解,最好是生成一个完整的数独解,再挖掉一些数字。貌似搜索这个万金油又能出来了,但搜索和随机怎么兼顾又成问题。看了楼主贴的c++代码,好象是绕过了这个矛盾——先在每一行上只填一个数字,然后用搜索求一解,再从解里挖掉若干数字。这样既能保证有解,又能保证一定的随机。但是,没有考虑多解的情况。难不成挖了以后再来求解的数目,等于1时才结束?虽然这种方法俺能用程序实现,但未免太笨拙了一点。不知哪位有更好的思路,帮俺提示提示。不一定需要程序的思路,只要知道人来做怎么考虑就行。
由 yxgszm & 星期日, 日 11:57
to LeeChange能不能将c++的代码,转化成delphi的,发个到我邮箱里面,谢谢!祝大家节日快乐哈
由 yxgszm & 星期二, 日 07:53
由 yxgszm & 星期六, 日 22:41
27 篇帖子 & 分页:2 / 2 &

我要回帖

更多关于 推理 数独 公开课 的文章

 

随机推荐