LeetCode036 Valid Sudoku

来源:互联网 发布:建筑工地用工人员软件 编辑:程序博客网 时间:2024/06/15 02:50

详细见:leetcode.com/problems/valid-sudoku


Java Solution: github

package leetcode;import java.util.Arrays;/* * A valid Sudoku board (partially filled) is not necessarily solvable.  * Only the filled cells need to be validated. * 只需要判断已经存在的数字是否合法就行,不需要管数独是否有解 */public class P036_ValidSudoku {public static void main(String[] args) {System.out.println(new Solution2().isValidSudoku(new char[][] {".87654321".toCharArray(),"2........".toCharArray(),"3........".toCharArray(),"4........".toCharArray(),"5........".toCharArray(),"6........".toCharArray(),"7........".toCharArray(),"8........".toCharArray(),"9........".toCharArray()}));}/* * 8 ms * 24.64% */static class Solution {    public boolean isValidSudoku(char[][] board) {        boolean[] isExistRow = new boolean[9];        boolean[][] isExistColumn = new boolean[9][9];        boolean[][] isExistNine = new boolean[9][9];        for (int i = 0; i < 9; i ++) {        Arrays.fill(isExistRow, false);        for (int j = 0; j < 9; j ++) {        if (board[i][j] == '.')        continue;        if (! isValid(isExistRow, board[i][j] - '1') ||        ! isValid(isExistColumn[j], board[i][j] - '1') ||        ! isValid(isExistNine[i/3*3+j/3], board[i][j] - '1'))        return false;        }        }        return true;    }    private boolean isValid(boolean[] isExist, int index) {    if(isExist[index])    return false;    isExist[index] = true;    return true;    }}/* * 6 ms * 41.76%  */static class Solution2 {public boolean isValidSudoku(char[][] board) {        boolean[] isExistRow = new boolean[9];        boolean[] isExistColumn = new boolean[9];        boolean[] isExistNine = new boolean[9];        for (int i = 0; i < 9; i ++) {        Arrays.fill(isExistRow, false);        Arrays.fill(isExistColumn, false);        Arrays.fill(isExistNine, false);        for (int j = 0; j < 9; j ++) {        if (! isValid(isExistRow, board[i][j] - '1') ||        ! isValid(isExistColumn, board[j][i] - '1') ||        ! isValid(isExistNine, board[i/3*3+j/3][i%3*3+j%3] - '1'))        return false;        }        }        return true;    }    private boolean isValid(boolean[] isExist, int index) {    if (index < 0)    return true;    if(isExist[index])    return false;    isExist[index] = true;    return true;    }}static class Solution3 {public boolean isValidSudoku(char[][] board) {return false;}}}


C Solution: github

/*    url: leetcode.com/problems/valid-sudoku/    9ms 41.33%*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define bool intbool isValidSudoku(char** b, int rs, int cs) {    int row = 0, col = 0, sign = 1, si = 0;    int ri = 0, ci = 0;    char s[9];    for (row = 0; row < rs; row ++) {        memset(s, 0, 9);        for (col = 0; col < cs; col ++) {            if (b[row][col] != '.') {                si = b[row][col] - '1';                if (si < 0 || si > 9) return 0;                s[si] ++;                if (s[si] > 1) return 0;            }        }        memset(s, 0, 9);        for (col = 0; col < cs; col ++) {            if (b[col][row] != '.') {                si = b[col][row] - '1';                if (si < 0 || si > 9) return 0;                s[si] ++;                if (s[si] > 1) return 0;            }        }    }    for (row = 1; row < 9; row += 3) {        for (col = 1; col < 9; col += 3) {            memset(s, 0, 9);            for (ri = -1; ri < 2; ri ++) {                for (ci = -1; ci < 2; ci ++) {                    if (b[row + ri][col + ci] != '.') {                        si = b[row + ri][col + ci] - '1';                        if (si < 0 || si > 9) return 0;                        s[si] ++;                        if (s[si] > 1) return 0;                    }                                  }            }                    }    }    return 1;}bool isValid2(char row[], int i) {    //'.'    if (i < 0 || i > 8) return 1;    //invalid    if (row[i] == 1) return 0;    //valid    row[i] = 1;    return 1;}bool isValidSudoku2(char** b, int rs, int cs) {    int i =0, j = 0;    char row[9], col[9], nin[9];    for (i = 0; i < 9; i ++) {        memset(row, 0, 9);        memset(col, 0, 9);        memset(nin, 0, 9);        for (j = 0; j < 9; j ++) {            if (isValid2(row, b[i][j] - '1') == 0)                return 0;            if (isValid2(col, b[j][i] - '1') == 0)                return 0;            if (isValid2(nin, b[i/3*3+j/3][i%3*3+j%3] - '1') == 0)                return 0;        }    }    return 1;}int main() {    char ** b = (char **) malloc(sizeof(char *) * 9);    int rs = 9, cs = 9;    b[0] = ".87654321";    b[1] = "2........";    b[2] = "3........";    b[3] = "4........";    b[4] = "5........";    b[5] = "6........";    b[6] = "7........";    b[7] = "8........";    b[8] = "9........";    printf("answer is %d\r\n", isValidSudoku(b, rs, cs));    free(b);    return 0;}



Python Solution: github

#coding=utf-8'''    url: leetcode.com/problems/valid-sudoku/    @author:     zxwtry    @email:      zxwtry@qq.com    @date:       2017年4月4日    @details:    Solution: 112ms 26.68%'''class Solution(object):    def isValidSudoku(self, b):        """        :type b: List[List[str]]        :rtype: bool        """        for k in range(9):            m = [False] * 9            for i in range(9):                if b[k][i] == '.': continue                v = int(b[k][i]) - 1                if m[v]: return False                m[v] = True            m = [False] * 9            for i in range(9):                if b[i][k] == '.': continue                v = int(b[i][k]) - 1                if m[v]: return False                m[v] = True            m = [False] * 9            x_base, y_base = (k // 3) * 3, (k % 3) * 3            for i in range(9):                x = x_base + (i // 3)                y = y_base + (i % 3)                if b[x][y] == '.':continue                v = int(b[x][y]) - 1                if m[v]: return False                m[v] = True        return True                                            


0 0
原创粉丝点击