37. 解数独

手机软件开发 2024-9-10 06:18:33 114 0 来自 中国
37. 解数独(难度:困难)

标题链接:https://leetcode-cn.com/problems/sudoku-solver/
编写一个步调,通过已填充的空格来办理数独题目。
一个数独的解法需遵照如下规则

  • 数字 1-9 在每一行只能出现一次。
  • 数字 1-9 在每一列只能出现一次。
  • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空缺格用 '.' 体现。
一个数独。
答案被标成赤色。
Note:

  • 给定的数独序列只包罗数字 1-9 和字符 '.' 。
  • 你可以假设给定的数独只有唯一解。
  • 给定命独永世是 9x9 情势的。
解法一:回溯法

该算法头脑比力简单,给每个方块都设置束缚,在数独上面放入一个数字,则这行、这列、这块(3*3)的元素都不能对这个数字再举使用用。从而镌汰回溯遍历的次数。
我们只须要,逐行逐列的对每一个须要填写的数独赋以值,若当前精确,那么就举行下个数独的赋值;若出现了辩说,则开始回溯,实行另一个可以的赋值。如果照旧不可,那就再次回退。
怎样检察是否辩说?

  • 对该行举行遍历,检察是否有与新值雷同的,即判断
    board[row] == ch
  • 对该罗列行遍历,检察是否有与新值雷同的,即判断
    board[col] == ch
  • 对该块举行遍历,检察是否有与新值雷同的,即判断
    board[lumpRow][lumpCol] == ch

    • 此中lumpRow是指当前数独位置对应的块序号,
      lumpRow = (row / 3) * 3 + j / 3
    • 此中lumpCol是指当前数独位置在对应的块中的下标,即从左到右,从上到下依次分列的序号,
      lumpRow = (row / 3) * 3 + j / 3

3.jpg 算法头脑:
(1)从左上角开始 row = 0,col = 0。直到到达第一个空方格。
(2)从 1 到 9 之间的数字d 依次实行放入[row,col] 格子
(3)若 d 没有出如今当前行,列,方块中,则放入该方格中,举行下一个方格的实行。
(4)若d出如今当前行或列或方块中,则回到到第(2)步,实行下一个d。
(5)若全部的d都实行完,仍然没有满意的,则回溯到上一步,即上一个方格的赋值举行更改,然后重复(2)以后的操纵。
代码:

您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-12-4 16:46, Processed in 0.169415 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表