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

请你判断一个 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

board[i].length == 9

board[i][j] 是一位数字(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();
}
相关推荐
故事和你918 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__8 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__9 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
_日拱一卒10 小时前
LeetCode:2两数相加
算法·leetcode·职场和发展
py有趣10 小时前
力扣热门100题之零钱兑换
算法·leetcode
董董灿是个攻城狮10 小时前
Opus 4.7 来了,我并不建议你升级
算法
无敌昊哥战神10 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode
脱氧核糖核酸__10 小时前
LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
数据结构·c++·算法·leetcode