LeetCode 36题:有效的数独

题目

请你判断一个 9 x 9 的数独是否有效。只需要根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 空白格用 '.' 表示。

示例 1:

复制代码
输入:board = 
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:true

示例 2:

复制代码
输入:board = 
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:false
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字(1-9)或者 '.'

代码

cs 复制代码
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool isValidSudoku(char **board, int boardSize, int *boardColSize);

int main()
{
    char *board[] =
        {"....5..1.", 
         ".4.3.....", 
         ".....3..1", 
         "8......2.", 
         "..2.7....", 
         ".....2...", 
         ".6....28.", 
         ".2.9.....", 
         "..4......"};
    int t, *te;            
    printf("%d", isValidSudoku(board, t, te));
    return 0;
}

bool isValidSudoku(char **board, int boardSize, int *boardColSize)//后两个参数没有用
{
    int rownums[10], colnums[10];
    memset(rownums, 0, sizeof(rownums));
    memset(colnums, 0, sizeof(colnums));
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            if (board[i][j] != '.')
            {
                int number = board[i][j] - '0';
                if (rownums[number] == 0)
                {
                    rownums[number] = 1;
                }
                else
                    return false;
            }
            if (board[j][i] != '.')
            {
                int number = board[j][i] - '0';
                if (colnums[number] == 0)
                {
                    colnums[number] = 1;
                }
                else
                    return false;
            }
        }
        memset(rownums, 0, sizeof(rownums));
        memset(colnums, 0, sizeof(colnums));
    }
    int i = 0, j = 0;
    for (int p = 3; p <= 9; p = p + 3)
    {
        for (int q = 3; q <= 9; q = q + 3)
        {
            i=p-3;
            for (; i < p; i++)
            {
                j=q-3;
                for (; j < q; j++)
                {
                    if (board[i][j] != '.')
                    {
                        int number = board[i][j] - '0';
                        if (rownums[number] == 0)
                        {
                            rownums[number] = 1;
                        }
                        else
                            return false;
                    }
                }
            }
        memset(rownums, 0, sizeof(rownums));            
        }
    }
    return true;
}
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法