上次在博客上发了一篇《C语言:回溯解数独程序》。实在很粗糙,效率相当差。正如在群里一位朋友说的:

你能不能别像傻瓜式一样从左到右从上到下这样搜索呢?如果你这样,我出第一行是空的数独题,那你不就要算死了?

听了这话也怪不好意思的,而且他确实给了我下面这么一个题目(是无解的),但我的题目却是卡住很久都没算出来。

[code lang="js"]0000004900

0000000000

0000000000

0007090000

0080000000

0000607000

1005300002

00000048000

原本再设计程序的时候findPosition函数是找出目前数字相对密集的位置,因为从这里开始计算量是最少的,但是由于当时并没有什么好的实现方法,自己又想早点将数独程序解出来,就采用上面说的最傻瓜的从上面第一个空位置开始。如果是一个正常的题目的话解题时间还能接受,但是如果像他给我这个无解的题目的话就不行了。所以我想还是只有先将findPosition优化一下,找出数字相对密集的地方。优化后的代码如下:

[code lang = "js"]

void findPosition(int *line,int *row)

{

int maxnum,maxrow;

int i,j;

maxnum = maxrow = -1;  //

//找到已填好数字最多的一行

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

if(9 == sd.line_count[i])

continue;

if(sd.line_count[i] > maxnum){

maxnum = sd.line_count[i];

*line = i;

}

}

//找到那一行没有填数且列填好数字最多的位置

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

if(0 == sd.data[*line][i]){

if(sd.row_count[i] > maxrow){

maxrow = sd.row_count[i];

*row = i;

}

}

}

}

[/code]

这样之后,代码的效率的确高了。上面的那个题目我统计了一下时间是这个多(采用clock()函数):

[code lang="js"]

test.txt

We don't find an answer.

It cost 0.010000s.

[/code]

然后我又找了几个题目来算,时间也减少了很多,下面举一个例,题目是:

[code lang="js"]

0 6 1 0 3 0 0 2 0

0 5 0 0 0 8 1 0 7

0 0 0 0 0 7 0 3 4

0 0 9 0 0 6 0 7 8

0 0 3 2 0 9 5 0 0

5 7 0 3 0 0 9 0 0

1 9 0 7 0 0 0 0 0

8 0 2 4 0 0 0 6 0

0 4 0 0 1 0 2 5 0

[/code]

下面是结果:

[code lang="js"]

c:\\test.txt

We find an answer.

7 6 1 9 3 4 8 2 5

3 5 4 6 2 8 1 9 7

9 2 8 1 5 7 6 3 4

2 1 9 5 4 6 3 7 8

4 8 3 2 7 9 5 1 6

5 7 6 3 8 1 9 4 2

1 9 5 7 6 2 4 8 3

8 3 2 4 9 5 7 6 1

6 4 7 8 1 3 2 5 9

We find an answer.  It cost 0.000000s.

[/code]

我知道这个解法还有一定的缺陷,因为对回溯的不熟悉,我不是很清楚findposition还可以怎样优化。但是我知道优化的方法还有很多,所以这篇文章是(一)。

下面再说下对上次程序的小改动:

init函数应该检查输入是否合法,就是检查一行或一列或一个3*3小九宫格是不是有相同的数字,这个很简单,改动后的代码如下:

[code lang="js"]

//把从文件中读取的数字保存进题目信息

int initSodu(int a[81],psodu ps)

{

if(NULL == ps)

return 0;

int i,line,row;

for(i = 0;line = (i/9 + 1),row = (i % 9 + 1),i < 81;i++){

if((ps->data[line][row] = a[i]) != 0){//该位置已填数字才有信息读啊

if(testThisNumber(line,row,a[i]))

return 0;

ps->line_number[line][a[i]] = 1;

ps->row_number[row][a[i]] = 1;

ps->small_number[TOSMALL(line,row)][a[i]] = 1;

ps->line_count[line]++;

ps->row_count[row]++;

ps->small_count[TOSMALL(line,row)]++;

ps->achieve_number++;

}

}

return 1;

}

[/code]

还有readFile函数可以这样改,简洁很多(也是上面那个网友说的,谢谢了)

[code lang="js"]

//从文件中读取数独题目

int readFile(char *filename,int a[])

{

FILE *fp = NULL;

int i = 0;

char c;

//文件是否成功打开

if((fp = fopen(filename,"r")) != NULL){

//从文件中读取数字,读到文件尾

while((c = fgetc(fp)) != EOF){

if(c >= '0' && c <= '9' && i < 81)

a[i++] = c - '0';

}

fclose(fp);  //关闭文件

}

else

return 0;        //文件读取失败则返回

if(i != 81)

return 0;

return 1;  //文件读取成功

}

[/code]

最后我想说的是今天群里有位朋友说我的博客太丑了,而且也不更新。他搜索site:www.dabentu.com搜不出,于是说博客太丑了百度都不收录 的。我马上搜了一下site:dabentu.com。有120多条,马上截图过去。虽然我不是很清楚这方面的事,但我也知道dabentu.com才是 顶级域名。自己选择这款主题就是因为喜欢,我也不在乎他人评价好坏,而且博客不收录没访问也没关系,我只是用来记录自己的学习经历,用来上传自己的一些代 码而已。说我不更新的话,确实,好几天没更新了。这几天一直不知道有什么好写的,觉得就算写了对别人也没太大价值,就不去费那个时间了。

好了,这就是这篇文章的内容(全文完)

c语言数独程序源码,c语言编程:优化回溯解数独程序相关推荐

  1. 易语言局域网 php 控制,易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码...

    下面我们对易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码文件阐述相关使用资料和易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码文件的更新信息. 易语言控制端源码,易语言被控制 ...

  2. 七夕节微信表白墙小程序源码/基于Laravel的表白墙微信小程序源码

    七夕节微信表白墙小程序源码/基于Laravel的表白墙微信小程序源码 ☑️ 编号:ym499 ☑️ 品牌:无 ☑️ 语言:小程序 ☑️ 大小:11.2MB ☑️ 类型:微信表白墙小程序 ☑️ 支持:小 ...

  3. 用于校园流浪猫信息记录和分享的小程序源码/微信云开发中大猫谱小程序源码

    用于校园流浪猫信息记录和分享的小程序源码/微信云开发中大猫谱小程序源码 ☑️ 编号:ym478 ☑️ 品牌:无 ☑️ 语言:微信小程序 ☑️ 大小:6.5MB ☑️ 类型:校园流浪猫信息记录和分享 ☑ ...

  4. thinkphp开发的活动报名小程序源码带后台管理完整的报名小程序源码

    介绍: 活动报名小程序源码,基于thinkphp开发的报名小程序源码,带有后台管理,用户发布活动信息.报名可以后台管理,简单测试了一下,基本都还是可以的. 不过需要注意的是,用户注册部分是发送手机短信 ...

  5. 小程序源码:修复登录大河盲盒小程序源码,实现运营“玩法自由”,超多功能的盲盒型抽奖挖矿程序源码下载

    程序介绍 应用支持哪些类型的商品? 1.实物需邮寄商品,用户领取时填写收货信息,后台发货. 2.虚拟商品,如:教程.课程.图文.图片.下载链接等等. 3.卡密商品,后台添加卡密商品,填写使用方法.批量 ...

  6. 小程序源码:端午送粽子祝福微信小程序源码下载支持打赏模式带背景音乐

    端午节的时候很火的一款小程序 给亲朋好友送祝福也是一款引流非常不错的一款小程序 支持打赏小程序模式实现盈利模式 当然了,有能力的小伙伴也可以魔改一下做成别的小程序也是可以的 该小程序无需服务器和域名, ...

  7. 小程序源码:网课查题微信小程序源码下载,题库资源丰富自动采集,支持语音拍照识别

    这是一款网课查题微信小程序源码 题库资源丰富自动采集, 支持语音拍照识别 该款采用接口方式,所以题库自动全网采集 而且该款小程序无需服务器和域名即可搭建 大家解压源码然后使用微信开发者工具打开源码 然 ...

  8. 【快递下单小程序源码】可运营+快递下单微信小程序

    [快递下单小程序源码]可运营+快递下单微信小程序 演示小程序:快递大师兄 需要准备的材料 需要准备一台2H4G的服务器,并安装宝塔. 一个已经备案的域名. 下载完整安装包文件 一.首先登录宝塔创建网站 ...

  9. 小程序源码:后台版本趣味测试微信小程序源码下载支持自定义问题等等

    这是一款有后台版本的趣味测试小程序 支持用户自定义添加和删除问题 支持流量主后台设置 支持用户个人中心等等 该程序是微擎框架的,所以后台需要有微擎 PS:该小程序的登录接口并未替换更新还是采用的旧版登 ...

  10. 【小程序源码】星座运势,周公解梦下载

    这是一款以星座运势查询,周公自定义解梦为主的一款小程序 多个功能包含如下: 星座查询 星座运势查询 十二生肖查询 生肖运势查询 星座配对 生肖配对 配对排行榜 星盘查询 周公解梦--等等大家自行研究吧 ...

最新文章

  1. grafana官方使用文档_可视化监控展示工具之Grafana,安装部署和使用
  2. Spring、Spring Boot和TestNG测试指南 - @ActiveProfiles
  3. 使用Java程序消费SAP Leonardo的机器学习API
  4. Json字符串解析原理、超大json对象的解析
  5. Node Buffer 利用 slice + indexOf 生成 split 方法
  6. 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)
  7. illegal multibyte sequence python3
  8. Linux系统Shutdown命令定时关机详解
  9. 转!最适合新手小白的8个python开发环境(内附python IDE最新下载地址+软件激活码+长期有效)
  10. Java中反射主要应用在哪里_Java学习:反射的应用场景和解析方法
  11. jidnserror.wo.com.cn:8080错误解决方法
  12. Springboot课程试题库管理系统毕业设计源码271129
  13. php怎么初始化融云sdk,初始化融云 SDK
  14. Unity中关于Destroy的API
  15. 邻菲罗啉二酰胺功能化/吡啶基改性纤维状介孔二氧化硅微球的应用
  16. 推荐读书论坛--栖息谷
  17. DeDeCMS v5.7 SP2 前台任意用户密码修改漏洞复现
  18. php添加水印,水印平铺整个图片
  19. Windows操作系统中nacos下载、安装、运行、访问
  20. Android 指引蒙版的实现

热门文章

  1. Dubbo单一长连接
  2. 苹果手机升级后怎么恢复旧版本_苹果手机误删了重要短信怎么恢复?
  3. Spring事务回滚实战
  4. Java单例破坏以及防止
  5. STM32仿真器检测不到内核,你的芯片坏了吗?
  6. 赢在中国与中国IT培训
  7. 软件无线电 | hackrf one 教程学习笔记lesson4-11
  8. 怎样生成二维码?分享几种轻易生成二维码的方法
  9. GIS开发:超图的webgl示例
  10. 【C++实战】找出周长最长的三角形