[LeetCode]36.Valid Sudoku

简介:

【题目】

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.

【题意】

假设一个数独是有效的,则它符合数独游戏 规则(点击打开链接)。

数独游戏 规则:

(1)每一行都必须1-9的范围内,且只出现一次。

2)每一列都必须在1-9的范围内,且只出现一次。

3)数字1-9在每个子宫格中只出现一次。

数独宫格可以部分填充,其中空单元格都充满了字符'.'。

例如:

部分填充的有效数独

【分析】

细节分析题

(1)检查行

(2)检查列

(3)检查9个子宫格

【代码】

/*********************************
*   日期:2014-01-20
*   作者:SJF0115
*   题号: Valid Sudoku
*   来源:http://oj.leetcode.com/problems/valid-sudoku/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;

class Solution {
public:
    bool isValidSudoku(vector<vector<char> > &board) {
        int i,j,k;
        //判断1-9是否已用
        bool used[9];
        for(i = 0;i < 9;i++){
            //检查行
            memset(used,false,9);
            for(j = 0;j < 9;j++){
                //不符合规则
                if(!check(board[i][j],used)){
                    return false;
                }//if
            }//for
            //检查列
            memset(used,false,9);
            for(j = 0;j < 9;j++){
                //不符合规则
                if(!check(board[j][i],used)){
                    return false;
                }//if
            }//for
        }//for
        //检查9个子宫格
        for(k = 0;k < 3;k++){
            memset(used,false,9);
            for(i = k*3;i < 3*k + 3;i++){
                for(j = 0;j < 3;j++){
                    //不符合规则
                    if(!check(board[i][j],used)){
                        return false;
                    }//if
                }//for
            }//for
            memset(used,false,9);
            for(i = k*3;i < 3*k + 3;i++){
                for(j = 3;j < 6;j++){
                    //不符合规则
                    if(!check(board[i][j],used)){
                        return false;
                    }//if
                }//for
            }//for
            memset(used,false,9);
            for(i = k*3;i < 3*k + 3;i++){
                for(j = 6;j < 9;j++){
                    //不符合规则
                    if(!check(board[i][j],used)){
                        return false;
                    }//if
                }//for
            }//for
        }//for
        return true;
    }
private:
    bool check(char c,bool used[9]){
        if(c == '.'){
            return true;
        }
        //字符c 已用
        if(used[c - '1']){
            return false;
        }
        //字符c 未用
        else{
            used[c - '1'] = true;
            return true;
        }
    }
};
int main() {
    Solution solution;
    bool result;
    vector<vector<char>> board;

    char value[9] = {'5','3','.','.','7','.','.','.','.'};
    vector<char> subBoard(value,value + 9);
    board.push_back(subBoard);

    value = {'6','.','.','1','9','5','.','.','.'};
    vector<char> subBoard1(value,value + 9);
    board.push_back(subBoard1);

    value = {'.','9','8','.','.','.','.','6','.'};
    vector<char> subBoard2(value,value + 9);
    board.push_back(subBoard2);

    value = {'8','.','.','.','6','.','.','.','3'};
    vector<char> subBoard3(value,value + 9);
    board.push_back(subBoard3);

    value = {'4','.','.','8','.','3','.','.','1'};
    vector<char> subBoard4(value,value + 9);
    board.push_back(subBoard4);

    value = {'7','.','.','.','2','.','.','.','6'};
    vector<char> subBoard5(value,value + 9);
    board.push_back(subBoard5);

    value = {'.','6','.','.','.','.','2','8','.'};
    vector<char> subBoard6(value,value + 9);
    board.push_back(subBoard6);

    value = {'.','.','.','4','1','9','.','.','5'};
    vector<char> subBoard7(value,value + 9);
    board.push_back(subBoard7);

    value = {'.','.','.','.','8','.','.','7','9'};
    vector<char> subBoard8(value,value + 9);
    board.push_back(subBoard8);

    result = solution.isValidSudoku(board);
    cout<<result<<endl;
    return 0;
}




【代码2】

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        bool used[9];
        for (int i = 0; i < 9; ++i) {
            fill(used, used + 9, false);
            // 检查行
            for (int j = 0; j < 9; ++j){
                if (!check(board[i][j], used)){
                    return false;
                }//if
            }//for
            fill(used, used + 9, false);
            // 检查列
            for (int j = 0; j < 9; ++j) {
                if (!check(board[j][i], used)){
                    return false;
                }//if
            }//for
        }//for
        // 检查 9 个子格子
        for (int r = 0; r < 3; ++r) {
            for (int c = 0; c < 3; ++c) {
                fill(used, used + 9, false);
                for (int i = r * 3; i < r * 3 + 3; ++i){
                    for (int j = c * 3; j < c * 3 + 3; ++j){
                        if (!check(board[i][j], used)){
                            return false;
                        }
                    }//for
                }//for
            }//for
        }//for
        return true;
    }
    bool check(char ch, bool used[9]) {
        if (ch == '.') return true;
        if (used[ch - '1']) return false;
        used[ch - '1'] = true;
        return true;
    }
};


目录
相关文章
|
5月前
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode 367. Valid Perfect Square
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
95 0
LeetCode 367. Valid Perfect Square
LeetCode 242. Valid Anagram
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
84 0
LeetCode 242. Valid Anagram
|
canal
LeetCode 125. Valid Palindrome
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
92 0
LeetCode 125. Valid Palindrome
|
算法
LeetCode 65. Valid Number
验证给定字符串是否可以解释为十进制数。
92 0
LeetCode 65. Valid Number
Leetcode-Easy 20. Valid Parentheses
Leetcode-Easy 20. Valid Parentheses
107 0
Leetcode-Easy 20. Valid Parentheses
LeetCode 20:有效的括号 Valid Parentheses
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. 有效字符串需满足: 左括号必须用相同类型的右括号闭合。
762 0