c语言编程数独游戏,编程做数独游戏

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反引号包裹反引号_五个金色反引号

反引号包裹反引号五种琴弦 从Java 1.0开始&#xff0c;我们就有了字符串文字"like this" 。 我们还想要其他什么字符串&#xff1f; 其他编程语言为我们提供&#xff1a; 表达式插值&#xff1a; s"I am ${age - 10} years old." 插值格式&#xff1a; f…

c语言iota怎么用,C++ std::iota用法及代码示例

存储顺序递增分配val的[first&#xff0c;last]个连续值范围内的每个元素&#xff0c;就像在写入每个元素之后以 val递增。模板&#xff1a;void iota (ForwardIterator first, ForwardIterator last, T val);参数&#xff1a;first, lastForward iterators to the initial and…

web自动化如何在不同浏览器运行_自动化决策环节的“心脏”将如何与众不同?...

原标题&#xff1a;自动化决策环节的“心脏”将如何与众不同&#xff1f;原宝钢研究院首席研究员郭朝晖博士认为&#xff1a;自动化本质是感知、决策和执行的统一自动化的理论基础是控制论。控制论诞生时&#xff0c;控制论之父维纳思考了这样一个问题&#xff1a;机器和人(动物…

Servlet中获取请求头的数据

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取请求头的数据** author liaowenxiong* date 2021/12/29 11:21*/ import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.ut…

jdk8 :: 什么意思_JDK 13:什么是AggressiveOpts?

jdk8 :: 什么意思JVM 11中已弃用Java VM标志-XX:AggressiveOpts [请参见JDK-8199777和JDK-8199778 ]“因为其行为是不明确的。” JDK-8199778的“问题”部分进一步解释了&#xff08;我强调了 &#xff09;&#xff1a; AggressiveOpts已被用作实现各种实验性能功能的一种包罗…

c语言递归函数检测回文,在C中使用递归函数的回文测试

我试图编写用于测试字符串的程序&#xff0c;如果它是回文或不是&#xff0c;但我总是得到输出&#xff0c;因为它不是一个。我的代码有什么问题&#xff1f;在C中使用递归函数的回文测试#include #include int is_palindrome(int start, int end, char *str){if (str[start] !…

获取macos mojave_高仿MacOS教程

“潮办公”关注我们拥有一台MacBook是很多人的梦想&#xff0c;但是高昂的售价成功逼退了一大波人。MacBook一直以颜值高、轻薄、系统流畅而出名&#xff0c;那么其他的小伙伴们想体验一波苹果系统怎么办&#xff1f;这个软件或许能帮你。Part 1安装Mydockmydock是windows下的一…

Servlet中防止盗链的代码

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取referer&#xff0c;防止盗链** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpSer…

android wtf_WTF连接池

android wtf让我们谈谈连接池。 我声称&#xff1a; 大多数流行的连接池的默认设置都很差&#xff01; 对您来说&#xff0c;这意味着&#xff1a; 去查看您的连接池设置。 如果您依赖默认设置&#xff0c;则可能会遇到问题。 您可能有内存泄漏和应用程序无响应&#xff08…

c语言实验5上机刘若慧2017年,《《 C语言程序设计案例教程》》.ppt

《《 C语言程序设计案例教程》》.ppt课堂练习&#xff1a; 7、求三个整数之和&#xff1a; 1 只用main函数 2 用求两个整数之和的函数实现 main int a, b, c, sum; scanf “%d, %d,%d”, &a, &b, &c &#xff1b; sum abc; printf “sum %d\n”,sum ; printf “%d%…

c++ vs 输出log到窗口_欧冠豪门碰撞,尤文vs巴萨,曼联vs红牛

点击上方蓝色字关注我们 “ 欧冠第二轮昨日完成8场比赛&#xff0c;3胜3平2负&#xff0c;各队保平争胜策略明显。今日各豪门再出发&#xff0c;竞彩推出4场热门比赛。热门014尤文vs巴萨&#xff0c;015曼联vs莱比锡红牛。”01—周三014 欧冠 尤文图斯vs巴塞罗那 2020-10-29 04…

Servlet中判断浏览器版本的代码

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取user-agent&#xff0c;判断浏览器版本** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.htt…

jakarta ee_在等待Jakarta EE时

jakarta ee自Oracle在JavaOne 2017宣布将Java™EE转移到Eclipse Foundation以来已有一年多了。此后&#xff0c;发生了很多事情&#xff1a; Java™EE 8 API和实现项目已在EE4J下建立 。 Eclipse GlassFish 5.1 即将发布 。 全新的Jakarta EE规范流程指日可待。 社区显示出…

c语言解析分隔符文本,c – 使用分隔符读取文件

正如其他两个答案所指出的那样,你必须使用std :: getline,但这就是我要做的&#xff1a;if (std::getline(is, zipcode, ,) &&std::getline(is, city, ,) &&std::getline(is, state)){d.zipCode std::stoi(zipcode);}我做的唯一真正的改变是我将提取包含在if语…

很高兴加入 英文_XR车载公司Holoride加入高通XR计划

原标题&#xff1a;XR车载公司Holoride加入高通XR计划XR车载公司Holoride进来了高通的Qualcomm XR Eneerprise决策 你大约没有听说过holoride&#xff0c;但你势必听说过高通公司。下面我们就来看看Holoride&#xff0c;他是一家确立两年的XR车载公司&#xff0c;起劲于提供家用…

Servlet中获取请求体的数据

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取请求体的数据** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import ja…

go语言var 和make_Var和语言设计

go语言var 和makeJava中的var是什么 在Java 10中引入的var预定义类型使您可以在为变量分配值时声明局部变量&#xff0c;而无需指定变量的类型。 当给变量赋值时&#xff0c;表达式的类型已经定义了变量的类型&#xff0c;因此没有理由在行的左侧再次键入类型。 例如&#xff0…

c语言每次堆的变化是1k,DSPXC语言+程序烧写讲述.ppt

DSPXC语言程序烧写讲述* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 注意事项: 电路元件初始化同步问题&#xff1a;由于外…

众智日照分析软件_飞时达CAD日照分析计算软件FastSUN V14.0.1发布升级

2020-7-13&#xff0c;正式对外发布飞时达日照分析软件FastSUN V14.0.1(32/64)&#xff0c;本次为小版本升级发布。温馨提醒&#xff1a;本次升级以安装包更新的方式发行&#xff0c;原14.0版本不需要卸载可直接覆盖安装本更新安装包14.0.1。飞时达日照分析软件FastSUN V14.0.1…

高频变压器_变压器图案

高频变压器Transformer模式是Java&#xff08;以及可能仅具有使用场所差异和不变参数类型的其他OO语言&#xff09;的设计模式&#xff0c;可帮助子类型层次结构内的对象将自己流畅地转换为任何类型的对象。 语境 我一直在关注与Jim Laskey发行的JDK-8203703有关的OpenJDK线程…