Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'
.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
Just follow the rules, check every row, every column and every block.
C++ Code:
/* * func: valid_sudoku * goal: to check if the sudoku board is valid * @param board: vector of sudoku board * return: true or false */ bool valid_sudoku(vector<vector<char> > &board){ assert(board.size() == 9); for(int i=0; i<9; i++){ assert(board.at(i).size() == 9); } vector<int> check_helper(9, 0); //Check each row for(int row=0; row<9; row++){ for(int column=0; column<9; column++){ if(board[row][column] != '.'){ if(check_helper[board[row][column] - '0'] != 0){ return false; }else{ check_helper[board[row][column] - '0'] = 1; } } } fill(check_helper.begin(), check_helper.end(), 0); } //Check each column for(int column=0; column<9; column++){ for(int row=0; row<9; row++){ if(board[row][column] != '.'){ if(check_helper[board[row][column] - '0'] != 0){ return false; }else{ check_helper[board[row][column] - '0'] = 1; } } } fill(check_helper.begin(), check_helper.end(), 0); } //Chech each block for(int row = 0; row < 9; row += 3){ for(int column = 0; column < 9; column += 3){ for(int row_offset = 0; row_offset < 3; row_offset++){ for(int column_offset = 0; column_offset < 3; column_offset++){ if(board[row + row_offset][column + column_offset] != '.'){ if(check_helper[board[row + row_offset][column + column_offset] - '0'] != 0){ return false; }else{ check_helper[board[row + row_offset][column + column_offset] - '0'] = 1; } } } } fill(check_helper.begin(), check_helper.end(), 0); } } return true; }
Python Code:
# func: To check if the current Sudoku board is a valid one # @param board: sudoku board # @return: True or False def valid_sudoku(board): assert len(board) == 9 for row in board: assert len(row) == 9 #Check every row check_helper = set() for row in board: for element in row: if element != '.': if element in check_helper: return False else: check_helper.add(element) check_helper.clear() #Check every column for column in xrange(9): for row in xrange(9): if board[row][column] != '.': if board[row][column] in check_helper: return False else: check_helper.add(board[row][column]) check_helper.clear() #Check every block for row in [0, 3, 6]: for column in [0, 3, 6]: for row_offset in xrange(3): for column_offset in xrange(3): if board[row + row_offset][column + column_offset] != '.': if board[row + row_offset][column + column_offset] in check_helper: return False else: check_helper.add(board[row + row_offset][column + column_offset]) check_helper.clear() return True
No comments:
Post a Comment