数独大家应该都玩过,1~9数字,满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。

起始会有一些给定的值,然后我们去填剩余的数,一个合理的数独最终解一定是唯一的。

九日哥也很喜欢玩数独,喜欢到最后都懒得算了,直接写个程序搜出答案。。。

解决思路是回溯,如果对回溯不了解的同学可以移步 http://blog.csdn.net/sm9sun/article/details/53244484

其实想一想,数独的规则是不是跟N皇后很相似??

我们假设一个9X9的二维数组a[9][9],如何判断值k是否可以插入某个点a[i][j]呢?

①该数组所有横向没有存在过k值

for(n=0;n<9;n++)
 if(a[i][n]==k)return 0;

②该数组纵向没有存在过k值

for(m=0;m<9;m++)
 if(a[m][j]==k)return 0;

③该点位于的九宫格3X3区间没有存在过k值

xm=(i/3)*3,xn=(j/3)*3; 
 for(m=xm;m<xm+3;m++)
 for(n=xn;n<xn+3;n++)
 if(a[m][n]==k)return 0;

再来看看搜索的过程,9X9总共81个格子,我们以一个数字n作为标记i,j坐标点的变量(i=n/9; j=n%9;)

即:80就相当于最后一个格子  8/9=8,8%9=8(数组以0开始)

如果n等于80,那么就表示我已经遍历到最后一个点了,如果满足条件的话我们就找到最终解了。

如果n不等于80,表示我们还要继续往下试,即用不同的k值试探当前i,j点是否可以放下

回归后回溯即可~

void SD(int a[9][9],int n)//求解
{int i,j;int b[9][9];for(i=0;i<9;i++)for(j=0;j<9;j++)b[i][j]=a[i][j];        //用b进行尝试i=n/9; j=n%9;              //行列 if(a[i][j]!=0)             //如果该位置固定 (n==80)?print(b):SD(b,n+1);else{ int k;                       //试数 for(k=1;k<=9;k++)if(test(b,i,j,k)) //可以 {b[i][j]=k;n==80?print(b):SD(b,n+1);b[i][j]=0; //回溯 }}
}

完整代码如下:

#include<stdio.h>
int count=0;
void print(int a[9][9])
{count++;printf("case: %d:\n",count);for(int i=0;i<9;i++)for(int j=0;j<9;j++){printf("%d",a[i][j]);   j==2?printf(" "):0;j==5?printf(" "):0;j==8?printf("\n"):0;j==8&&i%3==2?printf("\n"):0; }
}
//判断是否可以将第i行、第j列的数设为k
int test(int a[9][9],int i,int j,int k)
{int m,n,xm,xn;for(n=0;n<9;n++)if(a[i][n]==k)return 0;for(m=0;m<9;m++)if(a[m][j]==k)return 0;xm=(i/3)*3,xn=(j/3)*3; for(m=xm;m<xm+3;m++)for(n=xn;n<xn+3;n++)if(a[m][n]==k)return 0;return 1;
}void SD(int a[9][9],int n)//求解
{int i,j;int b[9][9];for(i=0;i<9;i++)for(j=0;j<9;j++)b[i][j]=a[i][j];        //用b进行尝试i=n/9; j=n%9;              //行列 if(a[i][j]!=0)             //如果该位置固定 (n==80)?print(b):SD(b,n+1);else{ int k;                       //试数 for(k=1;k<=9;k++)if(test(b,i,j,k)) //可以 {b[i][j]=k;n==80?print(b):SD(b,n+1);b[i][j]=0; //回溯 }}
}
int main()
{int a[9][9];printf("请输入原始数据,没有数据用0代替。\n");for(int i=0;i<9;i++)for(int j=0;j<9;j++)scanf("%d",&a[i][j]);printf("-------------------\n\n");SD(a,0);if(count==0)printf("此数独无解!");return 0;
}

用代码证明自己闲的蛋疼(三)——回溯法做数独相关推荐

  1. 用代码证明自己闲的蛋疼(四)——简易坑爹版学生管理系统

    众所周知,学生管理系统一直频繁的出没在我们的毕业设计当中. 当然,其大多数都是基于BS(Browser/Server)开发的~当年萌新的我还妄想用C写一个win32控制台的管理系统作为毕设蒙混过关,然 ...

  2. 用代码证明自己闲的蛋疼(一)——cmd闪瞎狗眼

    有一段时间痴迷于cmd命令行的字体颜色 相比黑底白字而言,如果我们的输出是五颜六色的那一定会逼格很多~ 我们系统也提供了这样的命令  COLOR 比如说 COLOR 01 如果想达到闪变的效果,我们就 ...

  3. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  4. 回溯法求解数独问题(最简单,通俗易懂,附C++代码)

    问题描述:数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个九宫格内的数字均含1-9,不重复 要求:设计算法随机生成不同 ...

  5. C语言代码质量与架构调整(三)

    一.前言 1.1.写的目的 这一篇文章是想自己最近对于架构.模块.组件的优化的思考做个总结,不然没有思考总结就是体会不到软件其中的乐趣.不过自己的认识是比较粗鄙和浅显的,所以更多的是记录笔记和想法. ...

  6. 闲得蛋疼的众人本着科学的态度亲身实践“为什么不能吞灯泡?”

    闲得蛋疼的众人本着科学的态度亲身实践"为什么不能吞灯泡?" http://four-corner.appspot.com/ http://four-corner.appspot.c ...

  7. 你们会因为代码烂,而入职两三天选择离职吗?

    最近看到一个问题,叫做「你们会因为代码烂,而入职两三天选择离职吗?」. 其实早先有过一些关于代码质量的讨论,比如「关于烂代码的那些事」,「程序员的日常:哪个蠢蛋写的烂代码?」,「你的代码写的很烂」.这 ...

  8. 强化学习代码实操和讲解(三)

    强化学习代码实操和讲解(三) 引言 杰克租车问题 重点代码解析 环境设置 poisson_probability:泊松概率的计算 expected_return:根据给定策略进行策略评估 figure ...

  9. VVC/H.266代码阅读(VTM8.0)(三. Slice到CTU的处理 )

    本文是本系列的第三篇博客,内容是分析从Slice到CTU的处理代码. 该系列相关博客为: VVC/H.266代码阅读(VTM8.0)(一. NALU提取) VVC/H.266代码阅读(VTM8.0)( ...

最新文章

  1. vue学习:vue中data和return data的区别
  2. 网络布线工程师科普铜缆光纤损耗那点事!
  3. 线性分组码c语言实验报告,C语言线性分组码(附注释).doc
  4. 工信部发布《区块链 数据格式规范》标准(PPT全文)
  5. 开机启动简易收集面板并最小化
  6. 服务器 16路直连 英特尔,Intel 10nm服务器怪咖:八通道+16条内存
  7. java我的世界损坏的种子,我的世界:5分钟让你通关游戏的种子,大神用这种子破了世界纪录...
  8. 单网卡配置内外网同时上网
  9. wps文档乱码怎么修复呢?
  10. 如何解决您的虚拟主机中有文件触发了安全防护报警规则,可能存在webshell网页木马...
  11. 纠删码(Erasure Code)及其演进LRC(Locally Repairable Codes)原理讲解
  12. Android仿人人客户端(v5.7.1)——个人主页(三)
  13. markdown语法中的空格_MarkDown语法
  14. clickHouse副本和同步机制
  15. Go语言之分支结构(十一)
  16. Java设计模式----创建者模式
  17. 产品经理之toB项目各阶段工作内容详解
  18. Java熔断器比较_线上防雪崩利器——熔断器设计原理与实现
  19. 讲道理 | 计算正交投影算子
  20. 数据传送类指令(PUSH,POP,LEA)

热门文章

  1. beyond compare类似软件_你用过最好用的截图软件是哪一款
  2. POCO C++ Libraies介绍及常见用法
  3. zeromq php server,zeromq   php 轻量级队列
  4. python直角三角形型编程_python打印直角三角形与等腰三角形实例代码
  5. C++:new[]和delete[]一定要配对使用吗?
  6. linux 内核设备管理模型sysfs(入门篇)
  7. 笨方法“学习python笔记之字典
  8. 【Tensorflow】tf.nn.depthwise_conv2d如何实现深度卷积?+深度可分离卷积详解
  9. 什么是端到端模型(end-to-end learning)?
  10. [UE4]报错:Material with missing usage flag was applied to skeletal mesh 的解决方法:为材质设置相应的 usage flag