当前位置: 首页 > news >正文

LeetCode 刷题【37. 解数独】

37. 解数独

自己做

解:排除填空(做不出)

class Solution {
public:void solveSudoku(vector<vector<char>>& board) {vector<vector<vector<bool>>> target(9,vector<vector<bool>(9,vector<bool>(9,true)));             //标记元素是否可取//初始化targetfor(int i = 0; i < 9; i++)for(int j = 0; j < 9; j++)if(board[i][j] != '.'){//对board[i][j]该位置所有元素标记不可取for(int z = 0; z < 9; z++)target[i][j][z] = false;//对同行、同列、3*3的该元素标记不可取for(int z = 0; z < 9; z++)                  //对同行target[i][z][board[i][j] - 1] = false;for(int z = 0; z < 9; z++)                  //对同列target[z][j][board[i][j] - 1] = false;for(int z = 0; z < 9; z++)                  //对3*3//计算该位置是在哪个3*3的块内: i/3,j/3,3*3块的起始块位置为【(i/3)*3,(j/3)*3】=>【(0,0)、(0,1)、(0,2)、(1,2)...】target[(i / 3) * 3 + z / 3][(j / 3) * 3 + z % 3][board[i][j] - 1] = false;}for(int i = 0; i < 9; i++)             //两重for遍历位置for(int j = 0; j < 9; j++){  if(board[i][j] == '.')               //遇到空格,填充元素for(int z = 1; z <= 9; z++){     //填充元素遍历if(target[i][j][z - 1] == true){  //查看该元素能否填充  board[i][j] = z;        //填充//填充后//对board[i][j]该位置所有元素标记不可取for(int k = 0; k < 9; k++)target[i][j][k] = false;//对同行、同列、3*3的该元素标记不可取for(int k = 0; k < 9; k++)                  //对同行target[i][k][board[i][j] - 1] = false;for(int k = 0; k < 9; k++)                  //对同列target[k][j][board[i][j] - 1] = false;for(int k = 0; k < 9; k++)                  //对3*3//计算该位置是在哪个3*3的块内: i/3,j/3,3*3块的起始块位置为【(i/3)*3,(j/3)*3】=>【(0,0)、(0,1)、(0,2)、(1,2)...】target[(i / 3) * 3 + k / 3][(j / 3) * 3 + k % 3][board[i][j] - 1] = false;break;}}//填充失败,说明之前有取错了的元素if(board[i][j] == '.'){//回退}}}
};

看题解

触摸到禁忌知识了属于是,留到后面回顾

37. 解数独 - 力扣(LeetCode)

官方代码:

class Solution {
private:bool line[9][9];bool column[9][9];bool block[3][3][9];bool valid;vector<pair<int, int>> spaces;public:void dfs(vector<vector<char>>& board, int pos) {if (pos == spaces.size()) {valid = true;return;}auto [i, j] = spaces[pos];for (int digit = 0; digit < 9 && !valid; ++digit) {if (!line[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]) {line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;board[i][j] = digit + '0' + 1;dfs(board, pos + 1);line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = false;}}}void solveSudoku(vector<vector<char>>& board) {memset(line, false, sizeof(line));memset(column, false, sizeof(column));memset(block, false, sizeof(block));valid = false;for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {if (board[i][j] == '.') {spaces.emplace_back(i, j);}else {int digit = board[i][j] - '0' - 1;line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;}}}dfs(board, 0);}
};

http://www.lryc.cn/news/615749.html

相关文章:

  • LabVIEW 机器人避障控制
  • 企业架构之导论(1)
  • C++设计模式单例模式(饿汉、懒汉模式)
  • Linux操作系统从入门到实战(十六)冯诺依曼体系结构,操作系统与系统调用和库函数概念
  • 【软件测试】BUG篇 — 详解
  • AI测试助手如何让Bug无处可藏
  • uni-app 网络请求终极选型:uni.request、axios、uni-network、alova 谁才是你的真命请求库?
  • Eclipse JSP/Servlet:深入解析与最佳实践
  • 繁花深处:花店建设的时代意义与多元应用—仙盟创梦IDE
  • 计算机视觉全景指南:从OpenCV预处理到YOLOv8实战,解锁多模态AI时代(第五章)
  • 【Docker进阶实战】从多容器编排到集群部署
  • [Linux]学习笔记系列 -- [arm][lib]
  • 13. 是否可以在static环境中访问非static变量
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 MySQL 服务器
  • opencv颜色识别项目:识别水果
  • jmeter常规压测【读取csv文件】
  • Ubuntu 22.04 离线环境下完整安装 Anaconda、CUDA 12.1、NVIDIA 驱动及 cuDNN 8.9.3 教程
  • AI绘画:生成唐初秦叔宝全身像提示词
  • 安全运维工具链全解析
  • ELK分布式日志采集系统
  • 【系统分析师】软件需求工程——第11章学习笔记(上)
  • 旅行者1号无线电工作频段
  • 《解锁 C++ 起源与核心:命名空间用法 + 版本演进全知道》
  • 计算机网络:求地址块128.14.35.7/20中的相关信息
  • 《从零构建大语言模型》学习笔记4,注意力机制1
  • Redis如何实现一个分布式锁?
  • Redis主从复制和哨兵模式
  • nginx+lua+redis案例
  • Error: error:0308010C:digital envelope routines::unsupported at new Hash
  • node.js 学习笔记3 HTTP