LeetCode-Algorithmus_C++ – effektives Sudoku

Bitte beurteilen Sie, ob ein 9 x 9 Sudoku gültig ist. Befolgen Sie einfach die folgenden Regeln, um zu überprüfen, ob die von Ihnen eingegebenen Nummern gültig sind.

Die Zahlen 1-9 dürfen in jeder Zeile nur einmal vorkommen.
Die Zahlen 1-9 dürfen in jeder Spalte nur einmal vorkommen.
Die Zahlen 1-9 dürfen in jedem 3x3-Haus nur einmal vorkommen, getrennt durch eine dicke durchgezogene Linie. (Bitte beachten Sie das Beispielbild)

Beachten:

Ein gültiges Sudoku (teilweise ausgefüllt) ist nicht unbedingt lösbar.
Sie müssen lediglich überprüfen, ob die von Ihnen eingegebenen Nummern gemäß den oben genannten Regeln gültig sind.
Leerzeichen werden durch „.“ dargestellt.

Beispiel 1:
Fügen Sie hier eine Bildbeschreibung ein
Eingabe: board =
[["5","3",".",".","7",".",".",".","."] ,["6
" ,".",".","1","9","5",".",".","."] ,[".","9","8",".
" ,".",".",".","6","."] , [
"8",".",".",".","6",".","." ,".","3"]
,["4",".",".","8",".","3",".",".","1"] ,[
" 7",".",".",".","2",".",".",".","6"] ,[".","6",".",
" .",".",".","2","8",".''] ,[ ".
",".",".","4","1","9"," .",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Ausgabe: wahr

Beispiel 2:
Eingabe: board =
[["8","3",".",".","7",".",".",".","."] ,["6
" ,".",".","1","9","5",".",".","."] ,[".","9","8",".
" ,".",".",".","6","."] , [
"8",".",".",".","6",".","." ,".","3"]
,["4",".",".","8",".","3",".",".","1"] ,[
" 7",".",".",".","2",".",".",".","6"] ,[".","6",".",
" .",".",".","2","8",".''] ,[ ".",".",".","4","1",
"9"," .",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Ausgabe: false
Erläuterung: Abgesehen davon, dass die erste Zahl in der ersten Zeile von 5 auf 8 geändert wurde, sind die anderen Zahlen in den Leerzeichen dieselben wie in Beispiel 1. Da sich aber im 3x3-Palast in der oberen linken Ecke zwei Achter befinden, ist dieses Sudoku ungültig.

   bool isValidSudoku(vector<vector<char>>& board) {
    
    
        // 二维数组 v,共有 27 行,每行有 128 个元素,初始值都为 0
    int v[27][128] = {
    
    0};

    // 遍历数独棋盘的行和列
    for(int i = 0; i < 9; ++i) {
    
    
        for(int j = 0; j < 9; ++j) {
    
    
            // 判断当前位置是否是数字,并且检查在行、列和九宫格内是否出现重复数字
            if(isdigit(board[i][j]) && 
            (v[i][board[i][j]]++ || v[9+j][board[i][j]]++ || v[18+(i/3)+(j/3)*3][board[i][j]]++)) {
    
    
                // 若出现重复数字,则返回 false
                return false;
            }
        }
    }

    // 若没有出现重复数字,则返回 true
    return true;
        }

Supongo que te gusta

Origin blog.csdn.net/weixin_43945471/article/details/132724399
Recomendado
Clasificación