在处理到小学 如下 数独问题时

Input1:

0 2 0 8 0 7 3 0 0
9 0 0 1 0 0 5 7 0
8 3 0 0 0 5 2 0 0
0 4 0 0 8 0 6 0 0
0 0 2 4 7 0 1 0 0
6 0 5 0 0 3 0 8 0
0 0 6 7 0 0 0 4 3
0 9 3 0 0 8 0 0 6
0 0 8 3 0 4 0 2 0

Input2:

0 0 0 1 6 0 0 0 0
0 0 3 0 0 9 0 0 4
7 0 0 0 0 0 8 2 0
0 8 0 7 0 0 0 0 0
9 0 0 0 0 0 0 0 5
0 0 0 0 0 1 0 4 0
0 4 5 0 0 0 0 0 6
8 0 0 5 0 0 1 0 0
0 0 0 0 3 2 0 0 0

Input3:

0 0 0 1 8 0 0 0 0
0 0 3 0 0 9 0 0 4
7 0 0 0 0 0 8 2 0
0 8 0 7 0 0 0 0 0
0 0 0 0 0 0 0 0 5
9 0 0 0 0 1 0 4 0
0 4 5 0 0 0 0 0 6
8 0 0 5 0 0 1 0 0
0 0 0 0 3 2 0 0 0

发现手算功力不够,也耗不起这个时间。

故决定编程解决,程序处理后,对应输出结果如下

Output1:

 5 2 1 8 9 7 3 6 49 6 4 1 3 2 5 7 88 3 7 6 4 5 2 9 17 4 9 5 8 1 6 3 23 8 2 4 7 6 1 5 96 1 5 9 2 3 4 8 72 5 6 7 1 9 8 4 34 9 3 2 5 8 7 1 61 7 8 3 6 4 9 2 5

Output2:

 4 2 8 1 6 7 5 3 95 1 3 2 8 9 7 6 47 6 9 4 5 3 8 2 16 8 4 7 2 5 9 1 39 7 1 3 4 6 2 8 53 5 2 8 9 1 6 4 72 4 5 9 1 8 3 7 68 3 6 5 7 4 1 9 21 9 7 6 3 2 4 5 8

Output3:

无解

打了一段时间的codeforces,发现码力渐涨,以下思路,代码全是独立完成,没有参考任何资料。

核心思路如下:

动手简单模拟,发现,格中某个数字是否能加入,要看,该格的行是否冲突,列是否冲突,小九宫格是否冲突。

//row[i][j] i行上是否存在数值j;col[i][j] i列上是否存在数值j;block[i][j] i块上是否存在数值j;
//block[i]对应小九宫格,共9个

一直有顾虑,每个格子都可能放1-9,每个格子有9种情况,那么总共有81个格子,那么就有9^81=1.97*10^77可能,那么dfs要超时。

其实呢,因为数独的约束,格子中放数字的可能,越到之后遇到的格子,越小,所有实际情况远远小于9^81=1.97*10^77,通常是九宫格初始给的数据越多,算法消耗的时间越小。

处理代码如下:

#include <stdio.h>
#define N 9
//row[i][j] i行上是否存在数值j;col[i][j] i列上是否存在数值j;block[i][j] i块上是否存在数值j;
//block[i]对应小九宫格,共9个
int a[N][N+1],row[N][N+1],col[N][N+1],block[N][N+1];//此处错写成int a[N][N],row[N][N],col[N][N],block[N][N];
void init(){int i,j;for(i=0;i<N;i++)for(j=0;j<N;j++){scanf("%d",&a[i][j]);//block的理解,建议拿出纸笔,研究小九宫格脚标规律row[i][a[i][j]]=1,col[j][a[i][j]]=1,block[(i/3)*3+j/3][a[i][j]]=1;}
}
void matrix(){int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++)printf(" %d",a[i][j]);printf("\n");}printf("\n");
}
void dfs(int r,int c){int i;if(r==N){//九宫格遍历完毕matrix();//打印return;}if(a[r][c]){if(c==N-1)dfs(r+1,0);//处理到行末,下一行开始else dfs(r,c+1);//同一行的下一列}else{for(i=1;i<=N;i++)if(!row[r][i]&&!col[c][i]&&!block[(r/3)*3+c/3][i]){row[r][i]=1,col[c][i]=1,block[(r/3)*3+c/3][i]=1,a[r][c]=i;if(c==N-1)dfs(r+1,0);else dfs(r,c+1);row[r][i]=0,col[c][i]=0,block[(r/3)*3+c/3][i]=0,a[r][c]=0;//回溯}}
}
int main(){init();dfs(0,0);return 0;
}

数独 九宫格 小学奥数相关推荐

  1. 围成一圈的排列组合问题_分班必考知识点!小学奥数之排列组合问题

    点击上方蓝字关注我们 查看更多知识点哦~ SH  研习社 往期精彩回顾 分班必考知识点!小学奥数之流水行船问题 分班必考知识点!小学奥数之牛吃草问题 分班必考知识点!小学奥数之巧算分数 分班必考知识点 ...

  2. 分解连续自然数的和_小学奥数各年级经典题解题技巧大全——分解因数法(2)...

    *例7: 在等式35×(    )×81×27=7×18×(    )×162的两个括号中,填上适当的最小的数.(适于六年级程度) 解:将已知等式的两边分解质因数,得: 5×37×7×(    )=2 ...

  3. 清华大学数学教授吐槽不会做孙子的小学奥数:这学的不是数学,是戏法

    这几天,清华大学教授王文湛的一个老视频火了.去年9月,他在一场演讲活动中,批评大众忽视数学基础教育的重要性,感慨现在太多孩子扎堆学奥数,学的不是数学,而是技巧.戏法."我的孙子,小学六年级也 ...

  4. 小学奥数 7657 连乘积末尾0的个数-2022.01.26

    http://noi.openjudge.cn/math/7657/ /* 小学奥数 7657 连乘积末尾0的个数-2022.01.26 http://noi.openjudge.cn/math/76 ...

  5. 小学奥数 7834 分成互质组 python

    http://noi.openjudge.cn/math/7834/ 参考: 信息学奥赛一本通(1221:分成互质组) https://blog.csdn.net/lvcheng0309/articl ...

  6. 小学奥数 7651 自来水供给 python

    http://noi.openjudge.cn/math/7651/ """ 小学奥数 7651 自来水供给 http://noi.openjudge.cn/math/7 ...

  7. 小学奥数 7648 蓄水池水管问题 python

    http://noi.openjudge.cn/math/7648/ """小学奥数 7648 蓄水池水管问题 http://noi.openjudge.cn/math/ ...

  8. 小学奥数 7830 求小数的某一位 python

    http://noi.openjudge.cn/math/7830/ """ 小学奥数 7830 求小数的某一位 http://noi.openjudge.cn/math ...

  9. 小学奥数_7829神奇序列求和 python

    http://noi.openjudge.cn/math/7829/ """小学奥数_7829神奇序列求和 http://noi.openjudge.cn/math/78 ...

最新文章

  1. 我的Android进阶之旅------gt;Java全角半角的转换方法
  2. uhttpd 架构调用细节之lua
  3. Okhttp----缓存的加入方式----附完整demo
  4. 图卷积神经网络_深度层次化图卷积神经网络
  5. mysql 存储过程 set into_mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法...
  6. winform定义数据源名称_winform ComboBox自定义数据源实现用户输入时出现与用户输入匹配的项...
  7. “不服跑个分?” 是噱头还是实力?
  8. 携Science封面、NIPS最佳论文,CMU大神博士毕业论文公开
  9. 你真的会玩SQL吗?你所不知道的 数据聚合
  10. [20180626]函数与标量子查询14.txt
  11. nginx常见配置详解
  12. 初接触设计模式 导航(一)
  13. android自动计步_自动计步器app下载
  14. 显著性 / 注意力机制
  15. git报错:Reinitialized existing Git repository in ...解决方法
  16. IE 无法正常打开,刚启动就关闭
  17. DAY9 :划词翻译字典 goldendict 使用教程
  18. 乱七八糟之处理器天梯图
  19. 第6例:菲波那切数列
  20. Linux Centos装机全过程总结,小白入(持续更新中...)

热门文章

  1. java运气红包_教你用java做个微信红包,自己做运气王!
  2. 浅谈RFID 智能柜系统
  3. 服务器退出安全狗服云,安全狗服云服务器状态查看方法详细教程
  4. 【隧道应用】SSH本地socks5代理
  5. 动画图标,如何实现页面中图标小动画,动画按钮 CSS JS
  6. 基于c语言Easyx库的捕鱼达人小游戏
  7. 进阶 c程序设计语言,C程序设计进阶
  8. 即时配送行业乱象 闪飞侠聚合突围迎战万亿赛道
  9. 通过虚拟机openwrt上网_vmware 12中安装 OpenWRT 及 网络配置
  10. linux下派克斯(PacketiX)安装教程