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 ‘.’

leetcode 36. Valid Sudoku_java

这道题就是判断目前的数独表格是否是合理的,需要判断每一行、每一列和每一个子矩形,判断的思路就是查看是否有重复元素,思路很简单,就是有点麻烦。

代码如下:

import java.util.HashSet;
import java.util.Set;

public class Solution 
{
    //这个很简单就是确认一下这个数独是否矛盾
    //就是确认每一行,每一列,每一个子方宫格是否矛盾
    //是否矛盾的标准就是是否有重复元素
    public boolean isValidSudoku(char[][] board) 
    {
        if(board==null)
            return true;

        //检查每一行
        for(int i=0;i<board.length;i++)
        {
            if(isVaild(board,i,0)==false)
                return false;
        }

        //检查每一列
        for(int i=0;i<board[0].length;i++)
        {
            if(isVaild(board,i,1)==false)
                return false;
        }

        //检查每一个子宫格
        for(int i=0;i<9;i+=3)
        {
            for(int j=0;j<9;j+=3)
            {
                int rowS=i,rowE=i+3;
                int colS=j,colE=j+3;
                if(isVaildFor(board,rowS,rowE,colS,colE)==false)
                    return false;
            }
        }


        return true;

    }

    //这个是见检查每一个子宫格的矛盾与否
    private boolean isVaildFor(char[][] board, int rowS, int rowE, int colS,int colE) 
    {
        Set<Character> mySet=new HashSet<>();
        for(int i=rowS;i<rowE;i++)
        {
            for(int j=colS;j<colE;j++)
            {
                if(board[i][j]!='.')
                {
                    if( mySet.contains(board[i][j]))
                        return false;
                    else
                        mySet.add(board[i][j]);
                }
            }
        }
        return true;
    }


     //这个是见检查每一行或者列的矛盾与否
    private boolean isVaild(char[][] board, int index, int flag) 
    {
        Set<Character> mySet=new HashSet<>();
        //flag为0表示每一行
        if(flag==0)
        {
            for(int i=0;i<9;i++)
            {
                if(board[index][i]!= '.')
                {
                    if( mySet.contains(board[index][i]))
                        return false;
                    else
                        mySet.add(board[index][i]);
                }
            }

        }else if(flag==1) //flag为1表示每一列
        {
            for(int i=0;i<9;i++)
            {
                if(board[i][index]!='.')
                {
                    if(mySet.contains(board[i][index]))
                        return false;
                    else
                        mySet.add(board[i][index]);
                }
            }
        }
        return true;
    }
}

下面是C++的做法,直接暴力即可

代码如下:

#include <iostream>
#include <vector>
#include <set>
using namespace std;

class Solution
{
public:
    bool isValidSudoku(vector<vector<char>>& board)
    {
        for (int i = 0; i < board.size(); i++)
        {
            if (isVaild(board, i, true) == false)
                return false;
        }

        for (int i = 0; i < board[0].size(); i++)
        {
            if (isVaild(board, i, false) == false)
                return false;
        }

        for (int i = 0; i < board.size(); i+=3)
        {
            for (int j = 0; j < board[0].size(); j+=3)
            {
                if (isVaildSub(board, i, j) == false)
                    return false;
            }
        }
        return true;
    }

    bool isVaild(vector<vector<char>> board, int n, bool isRow)
    {
        set<char> s;
        if (isRow)
        {
            for (int i = 0; i < board[0].size(); i++)
            {
                char key = board[n][i];
                if (key != '.')
                {
                    if (s.find(key) != s.end())
                        return false;
                    else
                        s.insert(key);
                }
            }
            return true;
        }
        else
        {
            for (int i = 0; i < board.size(); i++)
            {
                char key = board[i][n];
                if (key != '.')
                {
                    if (s.find(key) != s.end())
                        return false;
                    else
                        s.insert(key);
                }
            }
            return true;
        }
    }

    bool isVaildSub(vector<vector<char>> board, int a, int b)
    {
        set<char> s;
        for (int i = a; i < a + 3; i++)
        {
            for (int j = b; j < b + 3; j++)
            {
                char key = board[i][j];
                if (key != '.')
                {
                    if (s.find(key) != s.end())
                        return false;
                    else
                        s.insert(key);
                }
            }
        }
        return true;
    }
};