当前位置: 首页 > 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.xdnf.cn/news/1273051.html

相关文章:

  • 计算XGBoost分类模型的错误率
  • 网工笔记——BGP协议
  • 解决 Linux 下 “E: 仓库xxx没有数字签名” 问题
  • 编程基础之多维数组——同行列对角线的格
  • scanpy单细胞转录组python教程(四):单样本数据分析之降维聚类及细胞注释
  • (Python)爬虫进阶(Python爬虫教程)(CSS选择器)
  • stm32没有CMSIS文件
  • 【精彩回顾·成都】成都 User Group×柴火创客空间:开源硬件驱动 AI 与云的创新实践!
  • vue和react和uniapp的状态管理分别是什么,并且介绍和怎么使用
  • Day38--动态规划--322. 零钱兑换,279. 完全平方数,139. 单词拆分,56. 携带矿石资源(卡码网),背包问题总结
  • 如何理解SA_RESTART”被信号中断的系统调用自动重启“?
  • Vue3 组件化开发
  • 人工智能技术发展历史演变
  • Filter,Interceptor拦截器-登录校验
  • 关于城市农村创业的一点构想
  • RecyclerView 缓存机制
  • 堆----3.数据流的中位数
  • Slab 算法浅析
  • HTML全景效果实现
  • 【Python 语法糖小火锅 · 第 2 涮】
  • 容器技术基础与实践:从镜像管理到自动运行配置全攻略
  • 【数据分享】各省农业土地流转率(2010-2023)
  • 【Python 语法糖小火锅 · 第 4 涮】
  • 【Python 语法糖小火锅 · 第 3 涮】
  • 【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
  • 【Canvas与旗帜】圆角蓝底大黄白星十一红白带旗
  • UE破碎Chaos分配模型内部面材质
  • CentOS7编译安装GCC
  • 【Python 高频 API 速学 ④】
  • Spring学习笔记:Spring AOP入门以及基于Spring AOP配置的深入学习与使用