数独游戏的解法:

先将数独分为九个格子,用一个数组将每个小九宫格的候选数存放下来,将候选数挨个放进数独里的空位,如果这一行和这一列都没有这个数字,继续放入下一个,如果不能放入的话就回到上一步继续尝试,直到成功求出数独的解为止;

比如这个数独第一个九宫格的候选数就有1,2,7,8,9,我们需要从1开始放入第一个格子挨个尝试直到8的时候发现剩下的两个格子都不能放入

这个时候我们就要撤回上一个插入的7,发现8仍然不能放入,就继续撤回2,发现8可以放入,就将8放入3号位置,然后将9插入

这个时候我们发现2不能放入剩下的两格,我们就继续撤回到1插入的时候,将2放入1号位置,然后挨个放入剩下的数

循环这一过程,直到数独求出解为止;

这个方法比较容易想到,操作也比较容易实现

下面是代码

代码大多数都写了备注便于理解

题目需要的1000道题放在下面了,将这1000个txt文件拷到EXE文件同一目录就可以了

题目链接:数独题目

#include

#include

#include

#define MAX 81

typedef struct asd{

int x;//待测试的值的x坐标

int y;//待测试的值的y坐标

int p;//待测试的值的位置(1道9代表在九宫格里的位置)

int n;//待测试的值

}A;

A zhan[MAX];//存放每个放进题目数组测试的数据

void kongque(int queshi[9][9],int aa[9][9]);//函数将候选数数组里去除题目中有的数字

void shuchu(int aa[9][9],int q);//输出整个数组到文件中

int end(int aa[9][9]); //判断是否结束

int next(int queshi[9][9],int m,int n,int *x,int *y,int aa[9][9]);//查找下一个应该放进九宫格测试的数据

int chazhao(int aa[9][9],int m,int n,int num);//查找同一行同一列是否有相同的值

int nfrz(int queshi[9][9],int aa[9][9],int m,int n,int *p);//判断是否满足入栈条件(就是当前值是否可以插入九宫格)

int rz(int *t,int x,int y,int p,int num);//入栈操作

int cz(int *t,int *x,int *y,int *p,int *num);//出栈操作

void aaaa(char aa[10],int a);//计算题目文件的文件名

void bbbb(char aa[10],int a);//计算答案文件的文件名

int main(){

int i;//记录该调用哪道题

for(i=0;i<1000;i++){

int aa[9][9],j,k;//aa数组存放的是题目数独

int queshi[9][9];//存放的是每个九宫格的待选数

int end=0;//判断循环结束条件

int h=0,l=0,p=1;//h是候选数的行坐标,l是候选数的列坐标,p代表当前测试数属于小九宫格的位置

int t=-1;//栈的长度

int s=0,num;

FILE *u;

char qwe[10];

for(j=0;j<9;j++)//将数组置为每行都是(1到9)

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

queshi[j][k]=k+1;

aaaa(qwe,i);

u=fopen(qwe,"r");

for(j=0;j<9;j++){//读入题目

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

fscanf(u,"%d",&aa[j][k]);

}

}

fclose(u);

memset(zhan,0,sizeof(zhan));//将栈的数据全部置为0

kongque(queshi,aa);

while(end!=1){//开始求解

s=next(queshi,h,l,&h,&l,aa);//查找下一个应该放进九宫格测试的数据

if(s==0){//如果找到则进入下一层

s=nfrz(queshi,aa,h,l,&p);//判断能否插入数独里

if(s==0){//如果可以则将插入的数据存放到栈里(入栈)

s=rz(&t,h,l,p,queshi[h][l]);

if(s==0){ //如果入栈成功则写入数独

aa[h/3*3+(p-1)/3][h%3*3+(p-1)%3]=queshi[h][l];

l++;//待选数跳到下一个

p=1;//重新从第一个小格子开始判断是否插入

}

else{

end=1;//循环结束

}

}

else{

s=cz(&t,&h,&l,&p,&num);

if(s==0){//如果出栈成功则擦除插入的数据

aa[h/3*3+(p-1)/3][h%3*3+(p-1)%3]=0;

p++;

}

else

end=1;

}

}

else if(s==-1){

shuchu(aa,i);//输出求解完毕的数独

end=1;

}

else{

printf("发生未知错误");

end=1;

}

}

}

return 0;

}

//函数将候选数数组里去除题目中有的数字

void kongque(int queshi[9][9],int aa[9][9]){

int i,j,x,y;

for(i=0;i

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

if(aa[i][j]){

x=i/3*3+j/3;//数独数组和候选数数组的坐标转换

y=aa[i][j]-1;

queshi[x][y]=0;

}

}

}

}

//输出整个数组到文件中

void shuchu(int aa[9][9],int q){

int i,j;

FILE *p;

char qq[10];

bbbb(qq,q);

p=fopen(qq,"w");

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

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

fprintf(p,"%d ",aa[i][j]);

}

fprintf(p,"\n");

}

fclose(p);

}

//判断是否结束

int end(int aa[9][9]){

int i,j,num=0;

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

num=0;

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

num+=aa[i][j];//检查每一行是否为1到9

}

if(num!=45)

return -1;

}

for(j=0;j<9;j++){//检查每一列是否为1到9

num=0;

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

num+=aa[i][j];

}

if(num!=45)

return -1;

}

return 0;

}

//查找下一个应该放进九宫格测试的数据

int next(int queshi[9][9],int m,int n,int *x,int *y,int aa[9][9]){

int qqq=0;

if(n>8){//如果当前小九宫格填写完毕则进入下一个九宫格

n=0;

m++;

}

if(m>8){

qqq=end(aa);//判断是否结束

if(qqq!=0)

return -1;

else

return 1;

}

while(queshi[m][n]==0){

if(n<8)

n++;

else{

n=0;

m++;

if(m>8){

qqq=end(aa);

if(qqq!=0)

return -1;

else

return 1;

}

}

}

*x=m;//重新获取测试的值的x坐标和y坐标

*y=n;

return 0;

}

//查找同一行同一列是否有相同的值

int chazhao(int aa[9][9],int m,int n,int num){

int i;

for(i=0;i<9;i++){//查找行

if(aa[m][i]==num)

return -1;

}

for(i=0;i<9;i++){//查找列

if(aa[i][n]==num)

return -1;

}

return 0;

}

//判断是否满足入栈条件(就是当前值是否可以插入九宫格)

int nfrz(int queshi[9][9],int aa[9][9],int m,int n,int *p){

int s=*p;

int i,t1,t2,num;

num=queshi[m][n];

for(i=s;i<10;i++){

t1=(m/3)*3+(s-1)/3;

t2=(m%3)*3+(s-1)%3;

if(aa[t1][t2]!=0){

s++;

continue;

}

if(chazhao(aa,t1,t2,num)!=0){

s++;

continue;

}

else{

*p=s;

return 0;

}

}

return -1;

}

//入栈操作

int rz(int *t,int x,int y,int p,int num){

if(*t>=MAX){

return -1;

}

else{

(*t)++;

zhan[*t].x=x;

zhan[*t].y=y;

zhan[*t].p=p;

zhan[*t].n=num;

return 0;

}

}

//出栈操作

int cz(int *t,int *x,int *y,int *p,int *num){

if(*t==-1){

return -1;

}

else{

*x=zhan[*t].x;

*y=zhan[*t].y;

*p=zhan[*t].p;

*num=zhan[*t].n;

(*t)--;

return 0;

}

}

//计算题目文件的文件名

void aaaa(char aa[10],int a){

if(a>=0&&a<10){

aa[0]='0';

aa[1]='0';

aa[2]='0';

aa[3]=a+'0';

}

else if(a<100){

aa[0]='0';

aa[1]='0';

aa[2]=a/10+'0';

aa[3]=a%10+'0';

}

else if(a<1000){

aa[0]='0';

aa[1]=a/100+'0';

aa[2]=a/10%10+'0';

aa[3]=a%10+'0';

}

aa[4]='.';

aa[5]='t';

aa[6]='x';

aa[7]='t';

aa[8]='\0';

}

//计算答案文件的文件名

void bbbb(char aa[10],int a){

if(a>=0&&a<10){

aa[0]='a';

aa[1]='0';

aa[2]='0';

aa[3]=a+'0';

}

else if(a<100){

aa[0]='a';

aa[1]='0';

aa[2]=a/10+'0';

aa[3]=a%10+'0';

}

else if(a<1000){

aa[0]='a';

aa[1]=a/100+'0';

aa[2]=a/10%10+'0';

aa[3]=a%10+'0';

}

aa[4]='.';

aa[5]='t';

aa[6]='x';

aa[7]='t';

aa[8]='\0';

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Linux数独小游戏C语言,C语言数独游戏的求解方法相关推荐

  1. 数独小项目开篇:DFS解决数独难题

    数独小项目开篇:DFS解决数独难题 前言 DFS解决数独问题思路 代码实现细节 样例测试 总结 Reference 前言   这周小刀是挺忙的,周末加班,哎,谁不是996呢?(打工魂燃烧吧~   这次 ...

  2. Linux数独小游戏C语言,C语言实现数独游戏的求解

    玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 输入包含9x9的已知数字,空位用0补齐,中间用空格隔开.(输入数独题目确 ...

  3. C语言编写数独小游戏

    文章目录 1.前言 2.效果展示 3.代码 1.前言 这次数独小游戏的灵感来源于上次力扣做的题目,解数独.正好利用题目余热写了这一款小小游戏. 感兴趣的可以看看题目,哈哈 2.效果展示 3.代码 #p ...

  4. linux贪吃蛇c程序,Linux环境下C语言实现贪吃蛇游戏

    Linux环境下C语言实现贪吃蛇游戏 [liul@test snake]$ more snake.c #include #include #include #include #include #def ...

  5. C语言如何做手机游戏,C语言怎样实现一个简单的手机游戏小项目

    手机游戏名称:猜数字 使用的开发语言:C语言 基本规则:电脑随机生成一个1-30之间的数字,人和电脑分别猜一个数字,看谁的数字较为接近生成的数字. 要求:每个人和计算机10,000点,玩家进入多少分, ...

  6. c语言小游戏10例,C语言的应用 小游戏为例.doc

    C语言的应用 小游戏为例 贪吃蛇游戏设计 姓 名: 学 号: 班 级: 103511 指导老师: 张 印 2012年05月29日 <c语言程序设计>课程期末论文 PAGE I 目 录 TO ...

  7. 三星游戏java ball_JavaBallGame 使用 语言设计的弹球游戏,可以学习 编写小 的方法。 Program 238万源代码下载- www.pudn.com...

    文件名称: JavaBallGame下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 55 KB 上传时间: 2014-03-18 下载次数: 0 提 供 者: p ...

  8. 用python做C语言的猜数字游戏,[Python3 练习] 007 简单的猜数字小游戏

    题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...

  9. C语言小游戏大全,C语言贪吃蛇小游戏(附源码)

    一.C语言小游戏大全,C语言贪吃蛇小游戏(附源码) 贪吃蛇小游戏源码和更多C语言课设项目小游戏源码免 费 下 载 链 接 如下: c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载 ...

  10. 八个小灯泡闪烁的c语言程序,C语言猜数游戏程序.doc

    #include //包含 time函数 #define random(x) (rand()%x) void main() { int zhucaidan(); void youxijieshao() ...

最新文章

  1. Fragment注入漏洞(CVE-2013-6271)检测
  2. 2020年人工神经网络第二次作业-参考答案第四题
  3. 权限提升 T1548.002 绕过UAC
  4. 实现做出html的上标以及下标
  5. Android studio 关于SQlite数据库导出,创建数据库、表以及如何查看操作
  6. 大一python编程题_请教python编程问题(作业就剩这几道题了)
  7. java remove map_Java HashMap remove()方法
  8. 助力小程序生态发展 “小程序生态孵化社区”成立
  9. Nhibernate3.3.3sp1基础搭建测试
  10. 蓝屏蓝屏代码查询器_蓝屏点播?
  11. 2021暗月web渗透测试攻防全栈红队视频教程网络安全程师培训全系列学习心得分享
  12. 音乐API(仅测试使用)
  13. 数据可视化:大屏可视化设计全流程教程
  14. python将图片转换为csv
  15. 【小沐学python】(二)Python常见问题汇总
  16. FC金手指代码大全·持续更新-亲测可用-FC 经典游戏完整可用的金手指大全---持续更新,偶尔玩玩经典回味无穷,小时候不能通关的现在通通通关一遍
  17. tidymodels搞定二分类资料多个模型评价和比较
  18. 怎样的婚恋网站,才能符合单身的交友信息呢。
  19. 时间与时间戳如何转换
  20. CryENGINE3初探Entities (二)----使用C++创建自定义Entity(一)

热门文章

  1. java菱形_Java 之 菱形
  2. 如何写好一个打动投资人的计划书
  3. setResult(RESULT_OK, intent)回调不执行问题
  4. 优秀的程序员都热爱写作
  5. 不重装系统的情况下对C盘扩容
  6. 图深度学习 Deep Learning on Graph
  7. 从事IT业一个8年老兵转行前的自我总结1——初爻
  8. 关于codeblocks音乐播放
  9. 双纵坐标绘图-Plotyy
  10. 面试官:为什么选择做测试?我对测试特别感兴趣,我喜欢软件测试