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;
    }
};

 

 

posted @ 2017-08-10 00:56  Minec  阅读(250)  评论(0)    收藏  举报