力扣原题《有效的数独游戏》,纯手搓,已验证

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

数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 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

boardi.length == 9

boardij 是一位数字(1-9)或者 '.'

我的答案

cpp 复制代码
class  ValidSuduku {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        //本元素在3x3、行或列中是否出现过
        bool isValid = true;
        for (int i = 0; i < board.size(); i++)
        {
            for (int j = 0; j < board.size(); j++)//这个for如何省掉
            {
                char own = board[i][j];
                if (own != '.') 
                {
                     int x = i / 3, y = j / 3;
					 for (int p = 0; p < 3; p++)
					 {
					     for (int q = 0; q < 3; q++) 
					     {
					         if ((x * 3 + p != i && y * 3 + q != j)&&(own == board[x * 3 + p][y * 3 + q]))//先看3x3
					         {
					              isValid = false;
					              break;
					         }
					         int m = p*3 + q;
					         if ((m != i && own == board[m][j]) || (m != j && own == board[i][m]))//再看0-8的行列
					         {
					             isValid = false;
					             break;
					         }
					     }
					 }  
                }
                if (!isValid)
                    break;
            }
            if (!isValid)
                break;
        }
        return isValid;
    }
};

int main()
{
    vector<vector<vector<char>>> boards;
    char arrayBoards1[][9] = {
        { '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' }
    };
    char arrayBoards2[][9] = {
       { '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' }
    };
    vector<vector<char>> boards1(9,vector<char>(9));
    vector<vector<char>> boards2(9, vector<char>(9));
    for (int i = 0; i < 9; i++)
    {//此处耗时
        memcpy(&boards1[i][0], &arrayBoards1[i][0], 9 * sizeof(char));
    }
    for (int i = 0; i < 9; i++)
    {//此处耗时
        memcpy(&boards2[i][0], &arrayBoards2[i][0], 9 * sizeof(char));
    }
    boards.push_back(boards1);
    boards.push_back(boards2);
    ValidSuduku validSuduku;
    for (int i = 0; i < boards.size(); i++)
    {
        std::cout << "已填入的数字是否有效:" << (validSuduku.isValidSudoku(boards[i])==0?"False" :"True") << std::endl;
    }
    boards1.clear();
    boards1.shrink_to_fit();
    boards2.clear();
    boards2.shrink_to_fit();
    boards.clear();
    boards.shrink_to_fit();
}
相关推荐
海上小飞龙2 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂2 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i2 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息4 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.5 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕5 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng5 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
bryant_meng7 小时前
【Game】Powerful——Pets(4.4)125~135
游戏·幻唐志·墨虎·贪狼·蚩尤武魂
苏打豆7 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的7 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣