C语言中的数独问题(回溯)

本文介绍了如何使用C语言解决数独问题,重点在于回溯算法的应用。通过字符数组处理输入,利用一行一列及一宫内的数字约束进行递归穷举。在遇到无法填充的情况时,通过回溯并返回0来尝试其他可能,确保每个位置的数字选择不受已尝试的值影响。
摘要由CSDN通过智能技术生成

描述:
数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
输入:
一个9*9的矩阵,0表示该位置是空白。
输出:
一个9*9的矩阵,格式与输入类似。
输入样例:
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
输出样例:
971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854

1.这道题的输入很奇怪。如果一开始把数据输入到int型数组中,数组中就会有9个9位的数,而不是81个1位的数。所以只能把数据输入到字符型数组中,这样才能保证每次只读取一个数字。
2.用回溯法穷举二维数组时,不需要声明两个变量,只需要一个变量经过/和%运算就可以确定行和列。
3.在for循环后添加shudu[x][y]的必要。
和普通穷举不同,普通穷举时不需要考虑不同位置间数的关系;
和8皇后问题也不同,8皇后问题只需要考虑新加入的数和其左边其上边的数的关系;
数独问题中,每一个数和其前后左右的数都有关系。
所以一个位置在当前情况下取不到值时,应该在回溯前把该位置的值返回0,这样才不会影响其他数的取值,
相当于开始讨论一种新的情况。
如果不返回0,在讨论前面位置的其他情况时仍然会受这个位置的9的影响。

#include<stdio.h>
int shudu[9][
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值