问题描述:

数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。

例如:(数组里空缺的地方用0表示)

输入:

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

输出:

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

思想:

(本方法默认输入输出都是二维数组。)

用两个数组row[]和col[],在输入时,分别记录下“0”的横纵坐标,zero代表“0”的个数。

利用递归的方法,把每一个空按照1~9的顺序填进去,填完后检查这个数在此处的合理性,如:同行、列之内,还有所处的小方阵中,不可以出现与填进去的数字相同的数字。

如果合理,则继续向下一个空尝试,如果不合理则尝试下一个数字。

如果1~9中都没有合适的数字可以填,说明前面有填错的空,将此位置置0,返回。

函数中的z代表现在是填的第几个空,每次填数之前要比较z和zero的大小,如果z > zero,说明已经都填满了,直接返回即可。

flag的意义:用来表示数独是否填满,如果递归返回时flag为1,说明数独已经满了,直接返回即可。如果flag为0,说明递归并未结束。

#include<stdio.h>int num[9][9];
int flag = 0;
int check(int x, int y, int m)
{for(int i = 0; i < 9; i++)   //检查行同一行有没有这个数字{if(num[x][i] == m && i != y)return 0;    // 这个数已经存在}for(int i = 0; i < 9; i++)   //检查同一列有没有{if(num[i][y] == m && i != x)return 0;}int row = x / 3;int col = y / 3;//检查小方阵里是否存在for(int i = row * 3; i <= row * 3 + 2; i++){for(int j = col * 3; j <= col * 3 + 2; j++){if(num[i][j] == m && i != x && j != y)return 0;}}return 1;
}void fill(int z, int * row, int * col, int zero)   //递归填数,z是现在是第几个0,zero是这个表格里0的总量
{if(z > zero)  //都填满了{flag = 1;return;}//开始填数for(int i = 1; i < 10; i++){if(check(row[z - 1], col[z - 1], i) == 1)  //如果合理,就先用这个数继续填{num[row[z - 1]][col[z - 1]] = i;  //从1开始尝试fill(z + 1, row, col, zero);    if(flag)return;//else的话,此处就继续++往后试}}//如果进行到这里,说明此处没合适的数,需要回溯num[row[z - 1]][col[z - 1]] = 0;   //将此处重新置0return;}int main()
{int i, j;int zero = 0;   //记录数组中0的个数int row[50] = { 0 };   // 两个数组分别记录0的横纵坐标int col[50] = { 0 };for(i = 0; i < 9; i++){for(j = 0; j < 9; j++){scanf("%d", &num[i][j]);if(num[i][j] == 0){row[zero] = i;col[zero] = j;zero++;}}}int z = 1;  //从第一个0开始fill(z, row, col, zero);for(i = 0; i < 9; i++){for(j = 0; j < 8; j++){printf("%d ", num[i][j]);}printf("%d\n", num[i][8]);}return 0;
}

目前内存和时间都没有很好的实现,如果以后能有机会优化再说吧...能写出来已经知足了。

华为OJ-数独(C语言、递归)相关推荐

  1. oj上c语言编译错误,名字的漂亮度(华为OJ)C语言版本(提示格式错误,但是编译器没有报错,知道的网友提个意见)...

    描述 给出一个名字,该名字有26个字符串组成,定义这个字符串的"漂亮度"是其所有字母"漂亮度"的总和.每个字母都有一个"漂亮度",范围在1到 ...

  2. 华为oj题目c语言,华为OJ机试题目——24点游戏算法

    对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)o ...

  3. 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

  4. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  5. 汉塔克问题(C语言递归)

    汉塔克问题(C语言递归) 操作步骤 代码 操作步骤 当n为1时直接将盘子从第一个柱子移动到第三个柱子. 当 n>1时,先借助第三个柱子将n-1个盘子移动到第二个柱子,然后将第n个盘子从第一个柱子 ...

  6. go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...

    Gopher China作为国内最权威和最实力干货的Go大会,致力于为广大的Gopher提供一线分享交流机会,也为众多一线互联网公司大咖深入探讨Go语言的应用发展提供契机. 在近日于上海召开的第六届G ...

  7. C语言递归实现深度优先搜索DFS算法(附完整源码)

    C语言递归实现DFS算法 完整Graph.h 头文件 完整Graph.c 源文件文件 完整dfs_recursive.c 源文件(main测试函数) 完整Graph.h 头文件 #include &l ...

  8. C语言递归遍历一棵二叉树(附完整源码)

    C语言递归遍历一棵二叉树 结点结构体定义 二叉树递归遍历方式 完整实现和main测试源码 结点结构体定义 struct node {struct node *leftNode;int data;str ...

  9. python deepcopy函数_用Python解数独[6]:递归获得最终答案

    目录 用Python解数独[0] 用Python解数独[1]:求每个单元格的行值域 用Python解数独[2]:求列值域和九宫格值域 用Python解数独[3]:求总值域 用Python解数独[4]: ...

  10. c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑

    c语言递归解决汉诺塔参数变化的疑惑 答案:3  信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...

最新文章

  1. python入门指南许半仙txt-影帝的脑子坏了 第23章
  2. 值类型和引用类型在栈和堆中的分配
  3. 我的2013-从GIS学生到GIS职业人的飞跃
  4. NLP中的Mask全解
  5. 003-JavaString数据类型
  6. java href_jnlp href属性中的url参数
  7. Linux中cp和scp命令的使用方法和区别
  8. mybatis 遍历map_Mybatis 缓存系统源码解析
  9. Dell 12G服务器 手动安装RedHat 6.X
  10. linux启动mqtt_MQTT--linux安装部署(CentOS)
  11. RabbitMQ-镜像队列配置相关
  12. 【VRP】基于matlab蚁群算法求解多配送中心的车辆调度问题【含Matlab源码 1098期】
  13. SQL Server 2008 卸载报错
  14. wifi分析仪怎么看哪个信道好_wifi分析仪如何检测周围wifi信号 wifi分析仪使用方法【详解】...
  15. 2022-11-18 mysql列存储引擎-assert failed on i < m_idx.size() at rc_attr.h:342-问题分析
  16. docker 搭建本地 coredns 服务器
  17. 【文献调研】三相DLMP的motivation调研
  18. Wrong namespace. Expected ‘com.baizhi.mapper.UserMapper‘ but found ‘com.com.baizhi.mapper.UserMappe
  19. 浅谈javascript的原型和原型链(新手懵懂想学会原型链?看这篇文章就足够啦!!!)
  20. Cisco ISE AAA认证

热门文章

  1. 0.0 研磨设计模式
  2. mtkwin10驱动_【MTK通用USB刷机驱动下载】MTK通用USB刷机驱动 Win7/Win10 自动安装版-开心电玩...
  3. readelf的使用
  4. 华为NP课程笔记1-OSPF1
  5. 中国知名it软件开发外包公司有哪些呢
  6. ISO27001:2013和ISO27001:2005的差异对比
  7. 经典而常用的配乐和背景音乐合集(下)
  8. matlab里用simulink仿真教程,Matlab-Simulink仿真教程课件.ppt
  9. Topaz Gigapixel AI 人工智能图像放大
  10. getchar与getch函数的区别