< Summary

Information
Class: LeetCode.Algorithms.ValidSudoku.ValidSudokuBruteForce
Assembly: LeetCode
File(s): D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\ValidSudoku\ValidSudokuBruteForce.cs
Line coverage
96%
Covered lines: 60
Uncovered lines: 2
Coverable lines: 62
Total lines: 110
Line coverage: 96.7%
Branch coverage
96%
Covered branches: 29
Total branches: 30
Branch coverage: 96.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
IsValidSudoku(...)100%44100%
AreValidRows(...)83.33%6684.61%
AreValidColumns(...)100%66100%
AreValidBoxes(...)100%1010100%
TryInsert(...)100%44100%

File(s)

D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\ValidSudoku\ValidSudokuBruteForce.cs

#LineLine coverage
 1// --------------------------------------------------------------------------------
 2// Copyright (C) 2025 Eugene Eremeev (also known as Yevhenii Yeriemeieiv).
 3// All Rights Reserved.
 4// --------------------------------------------------------------------------------
 5// This software is the confidential and proprietary information of Eugene Eremeev
 6// (also known as Yevhenii Yeriemeieiv) ("Confidential Information"). You shall not
 7// disclose such Confidential Information and shall use it only in accordance with
 8// the terms of the license agreement you entered into with Eugene Eremeev (also
 9// known as Yevhenii Yeriemeieiv).
 10// --------------------------------------------------------------------------------
 11
 12namespace LeetCode.Algorithms.ValidSudoku;
 13
 14/// <inheritdoc />
 15public class ValidSudokuBruteForce : ValidSudokuBase
 16{
 17    /// <summary>
 18    ///     Time complexity - O(n^2)
 19    ///     Space complexity - O(n)
 20    /// </summary>
 21    /// <param name="board"></param>
 22    /// <returns></returns>
 23    public override bool IsValidSudoku(char[][] board)
 324    {
 325        Span<bool> seen = stackalloc bool[N];
 26
 327        return AreValidRows(seen, board) &&
 328               AreValidColumns(seen, board) &&
 329               AreValidBoxes(seen, board);
 330    }
 31
 32    private static bool AreValidRows(scoped Span<bool> seen, char[][] board)
 333    {
 6034        for (var row = 0; row < N; row++)
 2735        {
 54036            for (var column = 0; column < N; column++)
 24337            {
 24338                if (!TryInsert(seen, board[row][column]))
 039                {
 040                    return false;
 41                }
 24342            }
 43
 2744            seen.Clear();
 2745        }
 46
 347        return true;
 348    }
 49
 50    private static bool AreValidColumns(scoped Span<bool> seen, char[][] board)
 351    {
 4252        for (var column = 0; column < N; column++)
 1953        {
 36854            for (var row = 0; row < N; row++)
 16655            {
 16656                if (!TryInsert(seen, board[row][column]))
 157                {
 158                    return false;
 59                }
 16560            }
 61
 1862            seen.Clear();
 1863        }
 64
 265        return true;
 366    }
 67
 68    private static bool AreValidBoxes(scoped Span<bool> seen, char[][] board)
 269    {
 1070        for (var boxRow = 0; boxRow < N; boxRow += 3)
 471        {
 2872            for (var boxColumn = 0; boxColumn < N; boxColumn += 3)
 1173            {
 8674                for (var row = boxRow; row < boxRow + 3; row++)
 3375                {
 26276                    for (var column = boxColumn; column < boxColumn + 3; column++)
 9977                    {
 9978                        if (!TryInsert(seen, board[row][column]))
 179                        {
 180                            return false;
 81                        }
 9882                    }
 3283                }
 84
 1085                seen.Clear();
 1086            }
 387        }
 88
 189        return true;
 290    }
 91
 92    private static bool TryInsert(scoped Span<bool> seen, int cell)
 50893    {
 50894        if (cell == EmptyCell)
 34995        {
 34996            return true;
 97        }
 98
 15999        var cellIndex = GetCellIndex(cell);
 100
 159101        if (seen[cellIndex])
 2102        {
 2103            return false;
 104        }
 105
 157106        seen[cellIndex] = true;
 107
 157108        return true;
 508109    }
 110}