力扣算法笔记--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; }
虽然暴力破解可以解决问题,也便于理解。该题也可通过哈希表列解决,在后续的更新会解决的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律