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

请你判断一个 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();
}
相关推荐
freshman_y2 小时前
经典的C语言题型
c语言·开发语言·算法
small_wh1te_coder2 小时前
拷打字节技术总监: 详解c语言嵌入式多线程编程中的头文件 #总结 上下篇合 #
c语言·开发语言·算法·操作系统·嵌入式
字节高级特工2 小时前
C++从入门到熟悉:深入剖析const和constexpr
前端·c++·人工智能·后端·算法
Cathy Bryant2 小时前
聊聊拓扑学
笔记·算法·数学建模·拓扑学·高等数学
Lisssaa2 小时前
打卡第二十七天
算法
XWalnut2 小时前
LeetCode刷题 day2
算法·leetcode·职场和发展
Tisfy2 小时前
LeetCode 2946.循环移位后的矩阵相似检查:模拟(左即是右)
算法·leetcode·矩阵·题解
仲舟2 小时前
【Qt游戏】骰子街Machi_Koro_AI
c++·人工智能·qt·游戏
zhishidi2 小时前
推荐算法核心课:基于距离的相似度度量
算法·机器学习·推荐算法