`
SunnyYoona
  • 浏览: 367042 次
社区版块
存档分类
最新评论

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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics