lintcode 389判断数独是否合法
描述
请判定一个数独是否有效。
该数独可能只填充了部分数字,其中缺少的数字用 . 表示。
注意事项
一个合法的数独(仅部分填充)并不一定是可解的。我们仅需使填充的空格有效即可。
思路:
因为不用判断一个数独是否可解,因此根据数独定义(每一行/列数字皆不相同)可先判断每一行是否有相同的数字,再判断每一列是否有相同的数字。若有相同的数字,则不合法;反之,则为合法数独。解法如下:
class Solution { public: /* * @param board: the board * @return: whether the Sudoku is valid */ void clear(int *s, int n) { int i; for (i =0 ;i < n ; i++) { s[i] = 0; } } bool sudu(int s[],int n) { int i; for(i = 0 ;i <n ;i++) { if(s[i] > 1) return false; } return true; } bool isValidSudoku(vector<vector<char>> board) { int s[10]; int i,j; for (i = 0 ; i < 9 ; i++) { clear(s,10); for(j = 0;j < 9 ;j++) { if(board[i][j] != '.') s[board[i][j] - '0']++; } if(!sudu(s,10)) return false; } for (i = 0 ; i < 9 ; i++) { clear(s,10); for (j = 0 ; j<9 ; j++) { if(board[j][i] != '.') s[board[j][i] - '0']++; } if(!sudu(s,10)) return false; } int e,m,p; for (e = 0 , i = 0 ; i < 9 ; i++) { if (i % 3 == 0) p = i; clear(s,10); for(j = e ; j < e +3 ; j++) { for(m = p ; m < p+3 ; m ++) { if(board[j][m] != '.') s[board[j][m] - '0']++; } } if(!sudu(s,10)) return false; e = (e + 3) % 9; } return true; } };
浙公网安备 33010602011771号