数独游戏非常好玩,可以训练玩家的逻辑推理能力。数独游戏的规则是:

1.在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字。

2.必须满足的条件:每一行与每一列都有1到9的数字,每个小九宫格里也有1到9的数字,并且一个数字在每行、每列及每个小九宫格里只能出现一次,既不能重复也不能少。

3.每个数独游戏都可根据给定的数字为线索,推算解答出来,而且每个数独游戏的解答方案都是独一无二的。如下例:

3

6

5

2

9

4

8

2

9

3

7

1

8

5

6

1

7

4

3

3

5

7

2

3

4

7

8

1

4

4

9

8

6

5

3

做数独游戏的思路是,比如第一行,缺1,7,8三个数字。先把1拿出来,看第一行的三个空格中的一个空格所在的列及这个空格所在的小九宫,若没有1,则这个空格有可能填1。若这一行还有其他的空格也有可能填1,则不能填1,只有这一行其他的空格不能填1时,才能确定这个空格填1。如此进行下去,直到填完所有的空格。

当然也可以先查某一列缺哪些数字,判断这一列上的某个空格所在的行及小九宫里有没有要填的数字,来确定填哪个数字;也可以先查某个小九宫里缺哪些数字,判断这个小九宫里的某个空格所在的行、列有没有要填的数字,来确定填哪个数字。这三个方法可以灵活选用,很快就能得到答案

根据上面的分析,我们可以编程让计算机来做数独游戏,如下面的c语言程序

main()

{

static int a[9][9]={

{0,3,6,5,2,0,0,9,4},{0,0,8,0,0,0,0,2},{0,0,9,0,3,7,1,8},

{0,5,0,0,6,1},{7,0,0,0,4,0,0,0,3},{0,0,0,3,5,0,0,7},

{0,2,3,4,7,0,8},{0,1,0,0,0,0,4},{4,9,0,0,8,6,5,3}};

int b[9],i,j,k,l,m,n,jx,jgrow,jgcol,kt,ktw,leap;

printf("\n");

for (i=0;i<9;i++) /*输出原题*/

{

for (j=0;j<9;j++)

printf(" %d ",a[i][j]);

printf("\n");

}

jx=1;

while (jx) /*做游戏*/

{

for(i=0;i<9;i++)

{

for(k=0;k<9;k++) b[k]=k+1;

for(j=0;j<9;j++)

if(a[i][j]!=0)

for (k=0;k<9;k++)

if(b[k]==a[i][j]) b[k]=0;/*查这一行缺哪些数字,b[0]到b[8]中不为0的数即为这一行中缺少的数*/

for (k=0;k<9;k++)

if (b[k]!=0)

{kt=0;/*可填标志量*/

for (j=0;j<9;j++)

if (a[i][j]==0)

{ leap=1;/*a[i][j]这个空格所在的列及小九宫有无要填的数字*/

for (l=0;l<9;l++)

if (a[l][j]==b[k]) leap=0;/*这一列有这个数,不可填*/

jgrow=(i/3)*3;jgcol=(j/3)*3;

for (l=0;l<3;l++)

for (m=0;m<3;m++)

if(a[jgrow+l][jgcol+m]==b[k]) leap=0;/*小九宫内有这个数,不可填*/

if (leap) {kt++;if (kt==1) ktw=j;} /*第一次可以填时,记下坐标。*/

}

if (kt==1) {a[i][ktw]=b[k];kt=0;} /*填一个数字*/

}

}

jx=0;

for(i=0;i<9;i++)

for(j=0;j<9;j++)

if (a[i][j]==0) jx=1;

}

printf("\n");

for (i=0;i<9;i++)

{ for (j=0;j<9;j++)

printf(" %d ",a[i][j]);

printf("\n");

}

}

上面的程序的算法,是先查找每一行上缺哪一个数字,然后判断每一个所缺的数字能否填在这一行的空格上,能填的立即填上,不能填的等下一轮查找时继续判断,直到填完所有的空格。

我们若要先查找每一列上缺哪一个数字,与上面的程序类似,可写出下面的程序,只是要特别注意数组的下标。

main()

{

static int a[9][9]={

{0,3,6,5,2,0,0,9,4},{0,0,8,0,0,0,0,2},{0,0,9,0,3,7,1,8},

{0,5,0,0,6,1},{7,0,0,0,4,0,0,0,3},{0,0,0,3,5,0,0,7},

{0,2,3,4,7,0,8},{0,1,0,0,0,0,4},{4,9,0,0,8,6,5,3}};

int b[9],i,j,k,l,m,jx,jgrow,jgcol,kt,ktw,leap;

printf("\n");

for (i=0;i<9;i++)

{ for (j=0;j<9;j++)

printf(" %d ",a[i][j]);

printf("\n");

}

jx=1;

while (jx)

{

for(i=0;i<9;i++)

{

for(k=0;k<9;k++) b[k]=k+1;

for(j=0;j<9;j++)

if(a[j][i]!=0)

for (k=0;k<9;k++)

if(b[k]==a[j][i]) b[k]=0;

for (k=0;k<9;k++)

if (b[k]!=0)

{

kt=0;

for (j=0;j<9;j++)

if (a[j][i]==0)

{

leap=1;

for (l=0;l<9;l++)

if (a[j][l]==b[k]) leap=0;

jgrow=(j/3)*3;jgcol=(i/3)*3;

for (l=0;l<3;l++)

for (m=0;m<3;m++)

if (a[jgrow+l][jgcol+m]==b[k]) leap=0;

if (leap) {kt++;if (kt==1) ktw=j;}

}

if (kt==1) {a[ktw][i]=b[k];kt=0;}

}

}

jx=0;

for(i=0;i<9;i++)

for(j=0;j<9;j++)

if(a[i][j]==0) jx=1;

}

printf("\n");

for (i=0;i<9;i++)

{ for (j=0;j<9;j++)

printf(" %d ",a[i][j]);

printf("\n");

}

}

我们若要先查找每一个小九宫里缺哪几个数字,与上面的程序类似,可写出下面的程序:

main()

{

static int a[9][9]={ {0,3,6,5,2,0,0,9,4},{0,0,8,0,0,0,0,2,6},{0,0,9,0,3,7,1,8},{0,5,0,0,6,1},{7,0,0,0,4,0,0,0,3},{0,0,0,3,5,0,0,7},{0,2,3,4,7,0,8},{0,1,0,0,0,0,4},{4,9,0,0,8,6,5,3}};

int b[9],i,j,k,l,m,p,q,jx,kt,ktrow,ktcol,leap;

printf("\n");

for (i=0;i<9;i++)

{ for (j=0;j<9;j++)

printf(" %d ",a[i][j]);

printf("\n");

}

jx=1;

while (jx)

{

for (i=0;i<9;i+=3)

{

for (j=0;j<9;j+=3)

{

for(k=0;k<9;k++) b[k]=k+1;

for (l=i;l

for (m=j;m

for (k=0;k<9;k++)

if (b[k]==a[l][m]) b[k]=0;

for (k=0;k<9;k++)

if (b[k]!=0)

{

kt=0;

for (l=i;l

for (m=j;m

if (a[l][m]==0)

{

leap=1;

for (p=0;p<9;p++)

if (a[l][p]==b[k]) leap=0;

for (p=0;p<9;p++)

if (a[p][m]==b[k]) leap=0;

if (leap) {kt++;if (kt==1) ktrow=l,ktcol=m;}

}

if (kt==1) {a[ktrow][ktcol]=b[k];kt=0;}

}

}

}

jx=0;

for (i=0;i<9;i++)

for (j=0;j<9;j++)

if (a[i][j]==0) jx=1;

}

printf("\n");

for (i=0;i<9;i++)

{ for (j=0;j<9;j++)

printf(" %d ",a[i][j]);

printf("\n");

}

}

上面的三个程序(已通过验证)可单独运行,也可以组合在一块,提高效率。上题的答案如下:

1

3

6

5

2

8

7

9

4

5

7

8

9

1

4

3

2

6

2

4

9

6

3

7

1

8

5

3

5

2

7

6

1

9

4

8

7

6

1

8

4

9

2

5

3

9

8

4

3

5

2

6

7

1

6

2

3

4

7

5

8

1

9

8

1

5

2

9

3

4

6

7

4

9

7

1

8

6

5

3

2

下面的数独游戏,你会做吗?

1

9

2

2

5

3

6

1

8

9

3

2

3

5

7

1

4

9

7

9

5

1

7

9

2

5

4

9

3

8

(答案)

1

7

9

8

6

4

5

2

3

2

4

8

5

3

9

7

6

1

3

5

6

1

7

2

8

4

9

9

1

4

6

5

3

2

8

7

8

3

5

7

2

1

4

9

6

6

2

7

9

4

8

1

3

5

4

6

1

3

8

7

9

5

2

7

8

3

2

9

5

6

1

4

5

9

2

4

1

6

2

7

8

c语言编程数独游戏,编程做数独游戏相关推荐

  1. 小程序游戏开发有哪些游戏引擎可以选择?

    小游戏与小游戏引擎的关系 小游戏现在囊括的范围包括微信小游戏.QQ 空间小游戏.QQ 玩一玩(厘米游戏).Facebook Instant Games.各手机厂商的快应用小游戏,他们都在尝试着将社交场 ...

  2. C语言编程学习打造——做题游戏

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  3. android游戏编程之从零开始_纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子...

    很多编程爱好者都编写过推箱子游戏编程吧,最近有好些朋友看见我以前的推箱子程序后, 问我是怎么做的.我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空.正好现在放假了,而且离回 ...

  4. 给自学者的建议:想学游戏编程开发,你需要做什么?

    声明:只是个人见解!!! PS 2013/03/11 17:02 Yellow Lee早上在百度游戏开发贴吧,看到里面好多人很迷惘,加入置 顶的群,聊了一下,发现迷惘的人更多,做点事吧,憋着一口气写了 ...

  5. c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏

    C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...

  6. flash编程可以用c语言,C语言写的小游戏和FLASH小游戏有何区别呢-c语言编程手机软件...

    C语言写的小游戏和FLASH小游戏有何区别呢-c语言编程手机软件 (2010-12-05 17:12:08) 标签: 杂谈 分类: 随笔 同题有大大的区分c语言写游戏可以直接挪用体系api举行编著,合 ...

  7. go语言游戏编程初识--`Ebiten`

    Ebiten ebiten是一个简单的使用纯go实现的游戏,使用这个库即可以实现go语言代码的学习,又可以实现对游戏编程的了解. Hello world 让我们以一个Hello world!开始ebi ...

  8. c语言游戏编程网盘下载,C语言游戏编程 计算器(5分下载)

    C语言游戏编程 #include /*DOS接口函数*/ #include /*数学函数的定义*/ #include /*屏幕操作函数*/ #include /*I/O函数*/ #include /* ...

  9. mfc做数独游戏_我终于在iPhone上找到了体验最好的数独游戏

    我已经被一个 9×9 的格子困住将近 30 分钟,它既让人深陷其中还欲罢不能. 玩<数独 2>这款 app 之前我是抗拒的,因为我对数字超级无感,但抱着朋友告诉我入门很简单后试一试的心态, ...

最新文章

  1. Hexo+腾讯CVM+又拍云+github+gitee+coding
  2. SpringData ElasticSearch入门案例
  3. 图解比较李航书上的viterbi算法和dijistra算法
  4. 培训师 每小时多少钱_每个产品设计师需要了解的品牌知识
  5. 7-9 根据后序和中序遍历输出先序遍历 (10 分)
  6. Django echarts初试随笔
  7. 【PyQt】分析承载界面
  8. cas客户端登陆状态不同步_Java并发——同步组件
  9. 谷歌发布 Chrome 91,修复32个漏洞
  10. android 模拟器 锁屏,锁屏桌面全模拟 Android 4.0伪装教程
  11. 9种常见的反爬虫策略思路
  12. erdas几何校正_erdas图像几何校正操作步骤指南.doc
  13. kasp技术原理_Massarray技术——中高通量大样本的SNP检测利器!
  14. c语言将一个字符串转置,c语言实现数组的转置
  15. u盘超级加密3000使用方法
  16. Python MyQR 生成不一样的二维码
  17. STM32CubeMX学习笔记(48)——USB接口使用(MSC基于外部Flash模拟U盘)
  18. git恢复修改的文件
  19. 最全面java中的static关键字剖析
  20. ubuntu登录界面无限刷新

热门文章

  1. apache spark_如何将自定义数据源集成到Apache Spark中
  2. openshift 部署_在OpenShift上部署Java EE微服务
  3. @namedqueries_在@NamedQueries中枚举@NamedQuery
  4. java8升级java12_为什么现在是升级到Java 8的最佳时机
  5. spark wai_WAI-ARIA对自动完成小部件的支持
  6. java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高
  7. 使用Selenium Webdriver进行全屏截图
  8. java实现泛型检索_高级Java泛型:检索泛型类型参数
  9. rmi full gc问题_RMI强制Full GC每小时运行一次
  10. java 反射操作字段_x86上的Java最终字段没有操作?