问题 B: 数独
时间限制: 1 Sec 内存限制: 128 MB
题目描述
这个游戏只有一个规则:
将格子填满使得每一行,每一列,和每一个小的九宫格,恰好包含1-9这9个数字
正是由于规则简单而又变化多端,数独一时间风靡全球。
现在,我们希望你能编写一个程序解决数独问题。
输入
输入数据一共9行,每行有9个字符。
输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。
我们的输入数据总保证有唯一解。
输出
输出一共9行,每行9个数字,表示你的答案。
样例输入 Copy
5???7??6
?6???5?4
?834???
???182?4?
??1???9??
?7?369???
???543?
1?5???9?
7??2???1
样例输出 Copy
514927386
967831524
283456179
659182743
321574968
478369215
892615437
135748692
746293851
思路:
数独要求每一行、每一列、每一个3*3方阵内的数字不重复
所以我们把方阵分成9个小的方阵,并依次编号
我们需要判断行和列的重复,定义两个bool类型的二维数组
当这一行或这一列有数字或者填好数字后,标记为true
//例如第一行第三列填入数字2
bool p[ ][ ] , l[ ][ ];
p [1][2] = l[3][2] = true;
分成的9个小方阵,每过3列,方阵的序号+1,每过三行,方阵的序号+3
于是可以推出表达式:小方阵序号 = (行数-1) / 3 * 3+(列数-1) / 3+1
因为3的整数倍数/3 得到的答案会比原小方阵序号大1,所以行列数需要-1
最后dfs查找判断即可
注意数字与字符之间的转换
int sd[11][11];//数独方阵
bool p[11][11],l[11][11],fz[11][11];
//行,列,序号小方阵
void _out()//输出
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
printf("%d",sd[i][j

本文介绍了一种基于深度优先搜索的数独求解算法。通过使用三个布尔型二维数组来跟踪每一行、每一列和每个小方格内已填数字的状态,确保数独规则得到遵循。文章详细解释了如何遍历数独矩阵,填充缺失数字,并在找到解决方案时立即返回。此外,还讨论了如何在回溯过程中撤销选择,以便尝试其他可能的数字。
最低0.47元/天 解锁文章
2104

被折叠的 条评论
为什么被折叠?



