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

请你判断一个 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();
}
相关推荐
小雨下雨的雨16 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.19 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
海兰19 小时前
【水浒传:第二篇】AI江湖 —项目详细设计指南(一)
jvm·人工智能·游戏
一条小锦吕*19 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
如竟没有火炬21 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi821 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
会Tk矩阵群控的小木21 小时前
安卓群控系统对于游戏工作室实战教程
android·运维·游戏·adb·开源软件·个人开发
绿算技术21 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
想吃火锅10051 天前
【leetcode】1.两数之和js版
javascript·算法·leetcode