力扣算法笔记--2--判断有效数独(数组)

题目说明:

  请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

规则:①数字 1-9 在每一行只能出现一次。②数字 1-9 在每一列只能出现一次。③数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

示例:


            

 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"]]

数独部分空格内已填入了数字,空白格用 '.' 表示。
输出:true

直接暴力破解:

  数独有九行九列,从头依次边历各个元素,如果元素不是‘  . ’,则对数组元素进行规则判断,依次判断其所在行是否含有重复元素、所在列是否含有重复元素、所在子数独是否含有重复元素,如果含有重复元素则返回false,否则返回true。

  其中还有一个难点就是找各个子数独的下标,sx=(x/3)*3 开始的行下标;sy=(y/3)*3 开始的列下标。

 

代码如下:

复制代码
bool isValidSudoku(char** board, int boardSize, int* boardColSize){
    int x,y,sx,sy,i,j; //x行,y列,sx子行,sy子列
    for(x = 0;x < 9;x ++){                                //依次遍历数组的每一个元素 
        for(y = 0;y < 9;y ++){
            if(board[x][y] != '.'){                        //元素不是‘.’,则对元素进行规则判断 
                for(j = 0 ; j < 9 ; j ++){
                    if(j!=y){
                        if(board[x][j]==board[x][y])    //判断x行有没有相同元素 
                            return false;
                    }
                }
                for(i = 0 ; i < 9 ; i ++){
                    if(i != x){
                        if(board[i][y]==board[x][y])    //判断y列有没有相同元素 
                            return false;
                    }
                }
                sx=x/3*3;                                //子数独的开始行 
                sy=y/3*3;                                //子数独的开始列 
                for(i=0;i<3;i++){
                    for(j=0;j<3;j++){
                        if(sx+i!=x && sy+j!=y && board[sx+i][sy+j]==board[x][y])//不同行;不同列;同一个子数独中不能有相同元素 
                            return false;
                    }
                }
            }
        }
    } 
    return true;
}
复制代码

   虽然暴力破解可以解决问题,也便于理解。该题也可通过哈希表列解决,在后续的更新会解决的。

posted @   他乡一故知  阅读(378)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示