Thursday, October 17, 2013

36. Valid Sudoku

Q:
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.

A:   就是道简单的实现题
class Solution:
def isValidSudoku(self, board: list[list[str]]) -> bool:
def helper(row: int, col: int, board: list[list[str]]) -> bool:
ch, count = board[row][col], 0
if ch == '.':
return True
for j in range(9):
if board[row][j] == ch:
count += 1
if count > 1:
return False
count = 0
for i in range(9):
if board[i][col] == ch:
count += 1
if count > 1:
return False
r, c = row // 3 * 3, col // 3 * 3
count = 0
for i in range(r, r+3):
for j in range(c , c+3):
if board[i][j] == ch:
count += 1
return count <= 1


for row in range(9):
for col in range(9):
if not helper(row, col, board):
return False
return True







public class Solution { public boolean isValidSudoku(char[][] board) { // if(board==null || board.length ==0 || board.length !=9 || board[0].length!=9) // return false; for(int i =0;i<board.length;i++){ for(int j =0;j< board[0].length;j++) if( !isValid(i,j,board)) return false; } return true; } private boolean isValid(int row, int col , char[][] board){ char ch = board[row][col]; if(ch == '.') return true; for(int i = row+1; i<board.length;i++) if(board[i][col] == ch) return false; for(int j = col+1;j<board[0].length;j++) if(board[row][j] == ch) return false; board[row][col] = '.';// temporaryly change it for(int i = 0;i<3;i++) for(int j = 0;j<3;j++) if(board[row/3 * 3 +i][col/3*3+j] == ch) return false; board[row][col]=ch; return true; } }
这里,在小方框里,忘记check是否是原来的位置。

class Solution:

    def isValidSudoku(self, board: list[list[str]]) -> bool:

        def checkSet( arr: list[str]) -> bool:

            S = set()

            for ch in arr:

                if ch == '.':

                    continue

                if ch in S:

                    return False

                S.add(ch)

            return True


        # check each row

        for row in board:

            if not checkSet(row):

                return False


        # check each column

        for j in range(9):

            if not checkSet([row[j] for row in board]):

                return False


        # check 3 X 3

        for row in range(0,9,3):

            for col in range(0,9,3):

                B = [board[r][c]

for r in range(row, row+3)

for c in range(col, col+3)]

                if not checkSet([ch for row in B for ch in row]):

                    return False

        return True


public class ValidSudoku { public boolean isValidSudoku(char[][] board) { // we only check valid, but not solvable if(board==null || board.length ==0 || board.length !=9 || board[0].length!=9){ return false; } // check valid row & check valid chars boolean[] validArray; for (int i = 0; i < 9; i++) { // for each row validArray = new boolean[10]; for (int j = 0; j < 9; j++) { // check valid of chars if (! (board[i][j] >= '0' && board[i][j] <= '9') && board[i][j] != '.') { return false; } if(board[i][j]=='.')continue; int value = Integer.valueOf("" + board[i][j]); if (validArray[value]) { return false; } else { validArray[value] = true; } } } // check valid col for (int j = 0; j < 9; j++) { validArray = new boolean[10]; for (int i = 0; i < 9; i++) { // for each row if(board[i][j]=='.')continue; int value = Integer.valueOf("" + board[i][j]); if (validArray[value]) { return false; } else { validArray[value] = true; } } } // check valid square for (int outerI = 0; outerI < 3; outerI++) { for (int outerJ = 0; outerJ < 3; outerJ++) { validArray = new boolean[10]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if(board[3*outerI+i][3*outerJ+j]=='.')continue; int value = Integer.valueOf("" + board[3*outerI+i][3*outerJ+j]); if (validArray[value]) { return false; } else { validArray[value] = true; } } } } } return true; } }

Mistakes:
1: 对每个board上的数字, 当转换到int类型的时候,忘了检查,是否为'.'   , 造成了 Exception
2: 在检查小方格的时候, 忘了算上outerI,  outerJ的基数, 哎, SB啊
int value = Integer.valueOf("" + board[3*outerI+i][3*outerJ+j]);


Learned:



No comments:

Post a Comment