力扣算法笔记--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; }
虽然暴力破解可以解决问题,也便于理解。该题也可通过哈希表列解决,在后续的更新会解决的。