首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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 开始。...输出格式 输出一个整数,表示两条路径上取得最大和。

43930

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

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

32910

有效

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

13220

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

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

74920

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

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

46920

LeetCode - #36 有效

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

40630

回溯法应用:

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

74020

有效

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

38720

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 宫内只能出现一次。

29620

LeetCode题目36:有效

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

44810

有效(leetcode36)

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

34620

有效--题解

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

34720

有效

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

32920

【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。

12810

leetcode-36-有效

题目描述: 判断一个 9x9 是否有效。只需要根据以下规则,验证已经填入数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。...数字 1-9 在每一个以粗实线分隔 3x3 宫内只能出现一次。 ? 上图是一个部分填充有效部分空格内已填入了数字,空白格用 '.' 表示。...但由于位于左上角 3x3 宫内有两个 8 存在, 因此这个数是无效。 说明: 一个有效(部分已被填充)不一定是可解。 只需要根据以上规则,验证已经填入数字是否有效即可。...这个二维vector行数和列都是9,要求根据以下规则判断填入数字是否有效: ①一共9行,1-9数字在每一行,每个数字只能出现一次。...②一共9列,1-9数字在每一列,每个数字只能出现一次。 ③一共9个方块,每个方块都是3行3列,1-9数字在每个方块,每个数字只能出现一次。

37220
领券