首页
学习
活动
专区
圈层
工具
发布

C#中的数独算法

在C#中,数独算法通常使用回溯法来解决。以下是一个简单的C#数独算法实现:

代码语言:csharp
复制
using System;

class SudokuSolver
{
    private int[,] sudoku;

    public SudokuSolver(int[,] sudoku)
    {
        this.sudoku = sudoku;
    }

    public bool Solve()
    {
        return Solve(0, 0);
    }

    private bool Solve(int row, int col)
    {
        if (row == 9)
        {
            return true;
        }

        int nextRow = row;
        int nextCol = col + 1;

        if (nextCol == 9)
        {
            nextRow++;
            nextCol = 0;
        }

        if (sudoku[row, col] != 0)
        {
            return Solve(nextRow, nextCol);
        }

        for (int num = 1; num <= 9; num++)
        {
            if (IsValid(row, col, num))
            {
                sudoku[row, col] = num;

                if (Solve(nextRow, nextCol))
                {
                    return true;
                }

                sudoku[row, col] = 0;
            }
        }

        return false;
    }

    private bool IsValid(int row, int col, int num)
    {
        for (int i = 0; i < 9; i++)
        {
            if (sudoku[row, i] == num || sudoku[i, col] == num)
            {
                return false;
            }
        }

        int boxRow = row / 3 * 3;
        int boxCol = col / 3 * 3;

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (sudoku[boxRow + i, boxCol + j] == num)
                {
                    return false;
                }
            }
        }

        return true;
    }
}

这个算法使用了回溯法来解决数独问题。它首先检查当前单元格是否已经填充了数字,如果是,则跳过该单元格。否则,它会尝试填充1到9之间的数字,并检查该数字是否有效。如果数字有效,则递归调用Solve函数来填充下一个单元格。如果所有数字都无效,则回溯到上一个单元格并尝试其他数字。

这个算法的时间复杂度是O(9^(n*n)),其中n是数独矩阵的大小。在实际应用中,可以使用更高效的算法,例如Dancing Links算法,来解决数独问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

wing是什么_数独算法代码

设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。...在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。...输入格式 第一行为一个整数N,表示 N×N 的方格图。 接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。 行和列编号从 1 开始。...输出格式 输出一个整数,表示两条路径上取得的最大的和。

50330

☆打卡算法☆LeetCode 36、有效的数独 算法解析

一、题目 1、算法题目 “判断输入的数独数组是否是有效的。” 题目链接: 来源:力扣(LeetCode) 链接:36....有效的数独 - 力扣(LeetCode) (leetcode-cn.com) 2、题目描述 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 '.' 表示。 注意: 一个有效的数独(部分已被填充)不一定是可解的。...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。 二、解题 1、思路分析 这个题首先分析规则,同一个数字在每一行每一列每一个九宫格都只能出现一次。...这就可以使用哈希表判断每一行、每一列、每一个九宫格每个数字出现的次数,只需要遍历一次数独,就可以知道这个数独是否满足规则。 由于数独中的数字范围是1-9,所以可以使用数组代替哈希表进行计数。

39910
  • 有效的数独

    可以使用哈希表记录每一行、每一列和每一个小九宫格中,每个数字出现的次数。只需要遍历数独一次,在遍历的过程中更新哈希表中的计数,并判断是否满足有效的数独的条件即可。...由于数独中的数字范围是 到 ,因此可以使用数组代替哈希表进行计数。...具体做法是,创建二维数组 和 分别记录数独的每一行和每一列中的每个数字的出现次数,创建三维数组\textit{subboxes}记录数独的每一个小九宫格中的每个数字的出现次数,其中 、 和...分别表示数独的第 行第 列的单元格所在的行、列和小九宫格中,数字 出现的次数,其中 ,对应的数字 满足 。...如果更新后的计数大于 ,则不符合有效的数独的条件,返回 。 如果遍历结束之后没有出现计数大于1的情况,则符合有效的数独的条件,返回 。

    27920

    漫画:算法如何验证合法数独 | 全世界最难的数独?

    今天是小浩算法 “365刷题计划” 第95天 。数独相信在座的各位都玩过,那我们如何使用程序去验证一个 9×9 的数独是有效的呢?一起看下!...01 PART 有效的数独 数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。...那其实就两步: 第一步:遍历数独中的每一个元素 第二步:验证该元素是否满足上述条件 遍历这个没什么好说的,从左到右,从上到下进行遍历即可。就一个两层循环。...因为题目本身就是常数级的规模,所以时间复杂度就是 O(1)。 问题来了:如何验证元素在 行 / 列 / 子数独中没有重复项?...其实很简单,我们建立三个数组分别记录每行,每列,每个子数独(子数独就是上面各种颜色的小框框)中出现的数字。

    87120

    搞懂回溯算法,我终于能做数独了

    那我们今天就通过实际且有趣的例子来讲一下如何用回溯算法来解决数独问题。 一、直观感受 说实话我小的时候也尝试过玩数独游戏,但从来都没有完成过一次。...做数独是有技巧的,我记得一些比较专业的数独游戏软件,他们会教你玩数独的技巧,不过在我看来这些技巧都太复杂,我根本就没有兴趣看下去。 不过自从我学习了算法,多困难的数独问题都拦不住我了。...这是一个安卓手机中的数独游戏,我使用一个叫做 Auto.js 的脚本引擎,配合回溯算法来实现自动完成填写,并且算法记录了执行次数。...可以观察到前两次都执行了 1 万多次,而最后一次只执行了 100 多次就算出了答案,这说明对于不同的局面,回溯算法得到答案的时间是不相同的。 那么计算机如何解决数独问题呢?...'; } 以上思路就可以模拟出算法穷举的过程: 公众号后台回复关键词「数独」即可下载相应脚本、工具和游戏,Auto.js 是一款优秀的开源脚本引擎,可以用 JavaScript 操作安卓手机

    57220

    【暴力搜索】有效的数独

    有效的数独 36. 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注意: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。...解题思路:暴力搜索 + 布尔值数组判断 ​ 这道题其实就是得暴力搜索,遍历每个位置看看是否符合数独要求,但其实我们可以在判断要求的时候进行一点小优化(也不算是大优化,因为是用空间换时间),就是用布尔值类型的数组来表示某一行...并且我们这样子做有个好处,小坐标中的 0~2 为大坐标的 0,它可以直接 通过 0~2 除以 3 就能得到大坐标 0;而小坐标中的 3~5 为大坐标的 1,它可以直接通过 3~5 除以 3 就能得到大坐标

    12910

    LeetCode - #36 有效的数独

    微博:@故胤道长[1]**)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。...如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。 难度水平:中等 1. 描述 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注意: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。...时间复杂度:O(n^2) 空间复杂度:O(1) 该算法题解的仓库:LeetCode-Swift[2] 点击前往 LeetCode[3] 练习 特别感谢 Swift社区 编辑部的每一位编辑,感谢大家的辛苦付出

    49830

    有效的数独

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。....","7","9"] ] 输出: false 解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。 说明: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。...给定数独序列只包含数字 1-9 和字符 ‘.’ 。 给定数独永远是 9x9 形式的。 解1: 掌握核心科技,不过核心科技太难掌握。下面公式不知道哪个大神推导出来的,非常难。看解2。

    50720

    回溯法的应用:数独

    我之前做安卓课程设计找到课本上有一个数独游戏,当时玩的时候发现太费时间了,打算编写一个算法专门用来解数独,可是之前一直忘了这事,现在才想起来。...概述 在解数独之前首先说一下什么是数独,数独就是一个 9*9 的格子,每一个格子是数字 1~9 中的任意一个,要确保其所在的行,所在的列,所在的块(每个 3*3 的块,这样的块一共有 9 个)中都没有重复的数字...为了把数据和基于数据的操作封装在一起,依旧使用面向对象来实现。 初始化 在这个算法中,我们需要获取数独的初始状态,数独的初始状态很简单,一个 9 行 9 列的二维数组,其中未填项是 0。...我们直接把这个二维数组作为参数赋值给数独类的实例的属性即可。...,测试这个算法使用的是芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独。

    87920

    Leetcode No.36 有效的数独

    一、题目描述 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 '.' 表示。...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。 说明: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。...给定数独序列只包含数字 1-9 和字符 '.' 。 给定数独永远是 9x9 形式的。 二、解题思路 1、验证数字 1-9 在每一行只能出现一次。 2、验证数字 1-9 在每一列只能出现一次。...3、验证数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

    36320

    有效的数独(leetcode36)

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 数独部分空格内已填入了数字,空白格用 '.' 表示。....","7","9"] ] 输出: true 解析: 最简单的思路,是遍历9x9的数独三次,确保: 行中没有重复的数字 列中没有重复的数字 3x3 子数独没有重复数字 但是,实际上,它们都可以放到一次迭代...我们只需要记录对应的三种情况中数字出现的次数,如果次数大于1,说明数独无效,返回false。 ? 即:遍历数独,检查每个单元格中的值是否已经在当前的 行 / 列 / 子数独 中出现过。.../3; //记录当前单元格的值在行/列/子数独中出现的次数 rows[i].put

    41220

    有效的数独--题解

    有效的数独 难度中等506收藏分享切换为英文接收动态反馈 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 '.' 表示。 注意: 一个有效的数独(部分已被填充)不一定是可解的。...只需要根据以上规则,验证已经填入的数字是否有效即可。 示例 1: ?...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。...题解 思路: 使用一个维度相同的二位数组,把当前数独中的值映射到新数组中 如果数组的值为 1 ,代表是重复,否则是个新值 index_box 代表是同一个 3*3 的单元内都是一个索引 func isValidSudoku

    41220

    LeetCode题目36:有效的数独

    原题描述 + 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9在每一列只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3宫内只能出现一次。 ? 上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用 '.' 表示。...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。 说明: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。...列也是如此,也需要一个长度为9的hash table数组。 3*3子数独也需要长度为9的hash table。那么给定一个二维坐标(x,y),如何判断它属于第几个子数独?...我们可以一边扫描数独,一边将统计信息填入这三类hash table中,然后再检查是否有某个数字出现的次数多于1即可。最多扫描一遍,就可以判断出结果。

    53110

    有效的数独

    题目 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 ? 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 '.' 表示。....","7","9"] ] 输出: false 解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。...但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。 说明: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。...给定数独序列只包含数字 1-9 和字符 '.' 。 给定数独永远是 9x9 形式的。

    37920

    【leetbook刷题】有效的数独

    【题目】 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。...数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注意: 一个有效的数独( 部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。...题解: 建立三个数组第一个数组row [行数] [每个数的数量] 记录每行中1-9的数量,如示例1第一行有5 3 7.则row [1][5]=1 row[1][3]=1, row[1][7]=1   同理第二个数组...cols[每个数的数量][列数]  第三个数组为三维数组num [ 3] [3 ](前两个数代表第几个3X3的九宫格)[9] (最后一个代表每个九宫格中每个数的数量) 如:示例一中第3个3X3的九宫格应该表示为...num[1][3][6]=1; 在数组创建的时候将数组内所有的数初始化为0,若三个数组中任意一个大于2,则返回false; 当目标数组遍历后一遍后就返回true。

    18310
    领券