资讯动态

36. 有效的数独(Valid Sudoku)题解(C语言)

发布时间:2026/8/19 23:27:49 来源:尧图企业网站定制
题目描述判断一个9×9的数独是否有效。只需要根据以下规则验证已经填入的数字是否有效即可数字 1-9 在每一行只能出现一次数字 1-9 在每一列只能出现一次数字 1-9 在每一个以粗实线分隔的 3×3 宫内只能出现一次。注意空白格用.表示一个有效的数独不一定是可解的只需要验证已经填入的数字是否有效即可。示例 1输入 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示例 2输入 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]] 输出false 解释左上角 3×3 宫格内有两个 8因此无效。解题思路本题的核心是检查三种约束条件每行数字不能重复每列数字不能重复每个 3×3 宫格内数字不能重复。方法使用三个二维数组来记录数字是否出现过row[9][9]行出现记录col[9][9]列出现记录box[9][9]3×3 宫格出现记录遍历整个棋盘如果当前格是.跳过否则将字符转为数字索引num board[i][j] - 1计算当前格所属的宫格索引boxIndex (i / 3) * 3 j / 3如果row[i][num]、col[j][num]或box[boxIndex][num]已经标记过则返回false否则将其标记为已出现。遍历完成后仍未发现冲突则数独有效返回true。C语言实现#include stdbool.h bool isValidSudoku(char** board, int boardSize, int* boardColSize) { int row[9][9] {0}; int col[9][9] {0}; int box[9][9] {0}; for(int i 0; i 9; i){ for(int j 0; j 9; j){ if(board[i][j] .) continue; int num board[i][j] - 1; // 数字转换为索引 0~8 int boxIndex (i / 3) * 3 j / 3; // 计算 3x3 宫格索引 if(row[i][num] || col[j][num] || box[boxIndex][num]) return false; row[i][num] 1; col[j][num] 1; box[boxIndex][num] 1; } } return true; }算法分析时间复杂度O(9×9) O(1)固定大小棋盘遍历每个格子一次空间复杂度O(9×9) O(1)使用固定大小的三个二维数组存储状态。总结本题属于经典的状态记录题核心技巧是使用辅助数组记录行、列、宫格的状态宫格索引计算公式boxIndex (i/3)*3 j/3遇到 . 跳过即可。面试时如果能讲出这一思路并且写出简洁的 C 语言实现基本可以轻松通过。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价