解数独

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例:

输入: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"]]
输出:
[["5","3","4","6","7","8","9","1","2"],
["6","7","2","1","9","5","3","4","8"],
["1","9","8","3","4","2","5","6","7"],
["8","5","9","7","6","1","4","2","3"],
["4","2","6","8","5","3","7","9","1"],
["7","1","3","9","2","4","8","5","6"],
["9","6","1","5","3","7","2","8","4"],
["2","8","7","4","1","9","6","3","5"],
["3","4","5","2","8","6","1","7","9"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 '.'
  • 题目数据 保证 输入数独仅有一个解

以下程序实现了这一功能:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:void solveSudoku(vector<vector<char>> &board){int size = board.size();vector<vector<bool>> rows(size, vector<bool>(10));vector<vector<bool>> cols(size, vector<bool>(10));vector<vector<bool>> boxes(size, vector<bool>(10));for (int i = 0; i < size; i++){for (int j = 0; j < size; j++){if (board[i][j] != '.'){int num = board[i][j] - '0';int idx = i / 3 * 3 + j / 3;rows[i][num] = true;cols[j][num] = true;boxes[idx][num] = true;}}}dfs(board, 0, rows, cols, boxes);}private:bool valid(int num, int row, int col, int idx, vector<vector<bool>> &rows,vector<vector<bool>> &cols, vector<vector<bool>> &boxes){return !rows[row][num] && !cols[col][num] && !boxes[idx][num];}bool dfs(vector<vector<char>> &board, int size, vector<vector<bool>> &rows,vector<vector<bool>> &cols, vector<vector<bool>> &boxes){if (size == 9 * 9){return true;}else{bool ok = false;int row = size / 9;int col = size % 9;int idx = row / 3 * 3 + col / 3;if (board[row][col] == '.'){for (int i = 1; i <= 9; i++){if (valid(i, row, col, idx, rows, cols, boxes)){board[row][col] = i + '0';rows[row][i] = true;cols[col][i] = true;boxes[idx][i] = true;ok = dfs(board, size + 1, rows, cols, boxes);if (!ok){rows[row][i] = false;cols[col][i] = false;boxes[idx][i] = false;board[row][col] = '.';}}}}else{ok = dfs(board, size + 1, rows, cols, boxes);}return ok;}}
};

(每日一练c++)解数独相关推荐

  1. 【20221119】【每日一题】解数独

    编写一个程序,通过填充空格来解决数独问题. 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内 ...

  2. Leetcode每日一题——7. 解数独

    题目链接: 力扣 编写一个程序,通过填充空格来解决数独问题. 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分 ...

  3. 每日一练:Python国内疫情数据爬取与地图绘制

    Python 国内疫情数据爬取与地图绘制 效果图 累计确诊疫情地图绘制 ① 时时数据抓取 ② 获取省份疫情数据 ③ 视觉配置项分段颜色数据设置 ④ 累计确诊疫情地图绘制 现存确诊疫情地图绘制 ① 获取 ...

  4. 每日一小练——高速Fibonacci数算法

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: ...

  5. 数据结构与算法——每日一练(4月)

    文章目录 每日一练 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 4.17 4.18 4.19 4.20 ...

  6. java每日一练:面试题集合

    6.29:1.说一下jdk和jre的区别? JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的 ...

  7. C语言每日一练——第80天:换分币问题

    C语言每日一练 2022年2月13日 文章目录 题目描述 问题分析 代码实现 运行结果 题目描述 将5元的人民币兑换成1元.5角和1角的硬币,共有多少种不同的兑换方法. 问题分析 列举3元1次方程 1 ...

  8. C语言每日一练——第81天:马克思手稿中的数学题

    C语言每日一练 2022年2月17日 文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 题目描述 马克思手稿中有一道趣味数学问题:有30个人,其中有男人.女人和小孩,他们在同一家饭馆吃饭,总 ...

  9. C语言每日一练——第57天:递归解决分鱼问题

    C语言每日一练 2021年11月13日 文章目录 题目描述 分析 代码实现 运行结果 网上参考 题目描述 A.B.C.D.E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着 ...

最新文章

  1. ACMNO.50 完美的代价(主要是不同情况下面的讨论)
  2. python难学?对初学者不友好?进来看看,每30s就能学会一个小技巧,你get到了嘛?
  3. java.time不存在_jdk安装成功,但是eclipse打开出现的错误,找不到java runtime
  4. Analytics API and Customer Data Platform | Segment
  5. 职场上,比尽力更重要的,是要学会“借力”
  6. C++ string 大小写转换
  7. python的参数传递机制
  8. 堆栈小应用(一):括号匹配程序
  9. android 4.0.4模拟器,Android 4.0.4模拟器安装(转自51CTO)
  10. 数学之美系列 1.3w字精简版阅读笔记
  11. 调查问卷或量表数据的一般处理与SPSS统计分析
  12. 射频天线知识(一)——基础知识
  13. 在Linux下如何根据域名自签发OpenSSL证书与常用证书转换
  14. python的jieba分词词性标注
  15. LTE网络有关系统消息(MIB/SIB)深度解析
  16. 强化学习入门项目 Spinning up OpenAI (1) installation
  17. 金蟾论金:4.13黄金探底回升收复跌势、晚间黄金走势分析指导
  18. 【老李的模拟赛】【#7】【2014-08-13】
  19. 把一元兑换成1分、2分、5分的硬币,有几种换法?
  20. 5.15-19采集麦克风的声音信号

热门文章

  1. Proteus元器件对照表
  2. 【UE4 005】自定义人物角色(Charactor) 替换小白人
  3. java修改文件一行_java替换文件中某一行文本的内容
  4. OO ALV checkbox更新的问题
  5. 思科高级配置(配置标准ACL)
  6. ps怎么快速将图片变成黑白 在线PS哪个好用
  7. 2021年12月电子学会Python等级考试试卷(二级)答案解析
  8. 【密码学-凯撒密码】
  9. 虚拟化——ovirt删除host主机操作步骤
  10. 第三章习题2存款利息的计算