1. 程式人生 > 實用技巧 >62有效的數獨(36)

62有效的數獨(36)

作者: Turbo時間限制: 1S章節: 雜湊表

晚於: 2020-08-19 12:00:00後提交分數乘係數50%

截止日期: 2020-08-26 12:00:00

問題描述 :

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可:

數字 1-9 在每一行只能出現一次。

數字 1-9 在每一列只能出現一次。

數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。

上圖是一個部分填充的有效的數獨。

數獨部分空格內已填入了數字,空白格用 '.' 表示。

示例 1:

輸入:

53..7....

6..195...

.98....6.

8...6...3

4..8.3..1

7...2...6

.6....28.

...419..5

....8..79

輸出: true

示例 2:

輸入:

83..7....

6..195...

.98....6.

8...6...3

4..8.3..1

7...2...6

.6....28.

...419..5

....8..79

輸出: false

解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。

但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。

說明:

一個有效的數獨(部分已被填充)不一定是可解的。

只需要根據以上規則,驗證已經填入的數字是否有效即可。

給定數獨序列只包含數字 1-9 和字元 '.' 。

給定數獨永遠是 9x9 形式的。

可使用以下main函式:

int main()

{

vector<vector<char> > board;

char ch;

for(int i=0; i<9; i++)

{

vector<char> aLine;

for(int j=0; j<9; j++)

{

cin>>ch;

aLine.push_back(ch);

}

board.push_back(aLine);

}

bool res=Solution().isValidSudoku(board);

cout<<(res?"true":"false")<<endl;

return 0;

}

輸入說明 :

輸入9行,每行9個字元,只包含數字 1-9 和字元 '.'

輸出說明 :

輸出true或false

輸入範例 :

輸出範例 :

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

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) 
    {
        bool row[9][10]={0};
        bool col[9][10]={0};
        bool block[9][10]={0};
        
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                if(board[i][j]!='.')
                {
                    int t=board[i][j]-'0';
                    if(row[i][t])//判斷行有沒有重複的元素 
                        return false;
                    else
                        row[i][t]=true;
                    if(col[j][t]) 
                        return false;
                    else
                        col[j][t]=true;
                    int b=(i/3)*3+(j/3);
                    if(block[b][t])
                        return false;
                    else
                        block[b][t]=true;
                }
            }
        }
        return true;
    }
};


int main()
{
    vector<vector<char> > board;
    char ch;
    for(int i=0; i<9; i++)
    {
        vector<char> aLine;
        for(int j=0; j<9; j++)
        {
            cin>>ch;
            aLine.push_back(ch);
        }
        board.push_back(aLine);
    }
    bool res=Solution().isValidSudoku(board);
    cout<<(res?"true":"false")<<endl;
    return 0;
}
//https://leetcode-cn.com/problems/valid-sudoku/solution/36-jiu-an-zhao-cong-zuo-wang-you-cong-shang-wang-x/