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

代做一个网站多少钱免费申请个人网站申请

代做一个网站多少钱,免费申请个人网站申请,旅行网站的建设目录,营销策略是什么意思37. 解数独 - 力扣(LeetCode) 题目描述: 题目要求每一行 ,每一列,每个3*3 的子框只能出现一次。每个格子的数字范围1-9. 需要遍历每个空格填入可能的数字,并验证符合规则。如果符合就填入,不符…


37. 解数独 - 力扣(LeetCode)

题目描述:

题目要求每一行 ,每一列,每个3*3 的子框只能出现一次。每个格子的数字范围1-9.

需要遍历每个空格填入可能的数字,并验证符合规则。如果符合就填入,不符合就回溯。

解法: 

回溯算法通常用于解决这种需要试错的问题。当发现当前路径无解时候,返回上一步重新选择。

需要遍历每个空格,找到需要填写的空格,对每个空格尝试填入1-9,检查这个数字是否满足行,列 ,子框的要求。如果满足就填入这个数字,递归进行下一个空格,如果后续处理中,发现无法填入下去,就需要回溯。恢复这个空格的状态,尝试下一个可能的数字。

检查某个数字是否可以填入当前位置

对于 位置(i,i)需要检查i 行,j 列,所在的子框是否有这个数字,属于第几个子框可以用 (i/3 )*3,(j/3 )*3来确定 。i=4   4/3=1    1*3=3    ,起始行是3 ,遍历这个3*3的子框。

对于每个空格最多检查1-9个数字。,每个数字需要检查三个方向,最坏情况可能出现重复检查。

优化方法

用哈希表或者数据记录行,列,子框。已经出现的数字。用3个二维数组,记录rowi 表示第i行是否存在数组num,colj 表示第j 列是否存在数据num,boxk 表示第k 个子框中是否存咋这个数字num,

k 可以通过  i//3*3 +j//3 来计算 

i=0 ,j=0   ,k=0

i=3,j=3 ,k=4  在第四个子框。

预处理这三个数组,遍历整个数独,对这个对每个非空的格子,将对应的行列,子框中盖数字标记为存在。比如broad_i 为5 ,那么需要row_i  设置为true ,col_j 设置为true ,box_k (k为子框的索引)设置为true。

对每个空格尝试填入1-9 数字中的一个,

初始化  9X10 数组 其中索引 0不用 

步骤

1. 预处理三个数组row、col、box,记录每个行、列、子框中已经存在的数字。

2. 收集所有需要填写的空格的位置,存入一个列表spaces。

3. 编写一个回溯函数,参数是当前处理到spaces中的第pos个位置。当pos等于spaces的长度时,说明已经填完所有空格,返回True。

4. 对于当前处理的空格位置(i,j),尝试填入1到9中的一个数字d。如果该数字满足row[i][d]、col[j][d]、box[k][d]都为False,那么将该数字填入,并更新这三个数组的状态。然后递归处理pos+1的位置。如果递归返回True,说明后续的填写都成功,那么当前的选择是正确的,直接返回True。如果递归返回False,则说明后续无法完成,需要回溯,恢复三个数组的状态,并将board[i][j]恢复为'.',然后尝试下一个数字。

5. 如果所有数字都尝试过且都不行,则返回False,触发上一层递归的回溯。

这样,当递归函数返回True时,说明已经找到解,此时board已经被正确填充。

    # 初始化 3个数组row = [[False] * 10 for i in range(9)]print(row)  # 每行十个元素col = [[False] * 10 for i in range(9)]box = [[False] * 10 for i in range(9)]

[[False, False, False, False, False, False, False, False, False, False],[False, False, False, False, False, False, False, False, False, False],[False, False, False, False, False, False, False, False, False, False],[False, False, False, False, False, False, False, False, False, False], 
[False, False, False, False, False, False, False, False, False, False],[False, False, False, False, False, False, False, False, False, False], 
[False, False, False, False, False, False, False, False, False, False], 
[False, False, False, False, False, False, False, False, False, False],[False, False, False, False, False, False, False, False, False, False]]

 遍历数组填充已经有的数字 spaces 用于记录空格的位置

# 遍历整个数组 记录每个行 ,列子框中已经存在的数字spaces = []for i in range(9):for j in range(9):if board[i][j] != '.':d = int(board[i][j])row[i][d] = Truecol[j][d] = Truek = (i // 3) * 3 + (j // 3)box[k][d] = True  # 第k 个箱子的d 是否存在# 保存空格的位置到spaceselse:spaces.append((i, j))print("空格的位置", spaces)

空格的位置 [(0, 2), (0, 3), (0, 5), (0, 6), (0, 7), (0, 8), (1, 1), (1, 2), (1, 6), (1, 7), (1, 8), (2, 0), (2, 3), (2, 4), (2, 5), (2, 6), (2, 8), (3, 1), (3, 2), (3, 3), (3, 5), (3, 6), (3, 7), (4, 1), (4, 2), (4, 4), (4, 6), (4, 7), (5, 1), (5, 2), (5, 3), (5, 5), (5, 6), (5, 7), (6, 0), (6, 2), (6, 3), (6, 4), (6, 5), (6, 8), (7, 0), (7, 1), (7, 2), (7, 6), (7, 7), (8, 0), (8, 1), (8, 2), (8, 3), (8, 5), (8, 6)]


d = int(board[i][j])  填充的数字作为下标

  row:  row[i][d]=True

[[False, False, False, True(3), False, True(5), False, True(7), False, False],[False, True(1), False, False, False, True(5), True(6), False, False, True(9)],[False, False, False, False, False, False, True(6), False, True(8), True(9)], 
[False, False, False, True(3), False, False, True(6), False, True(8), False],[False, True(1), False, True(3), True(4), False, False, False, True(8), False],[False, False, True(2), False, False, False, True(6), True(7), False, False], 
[False, False, True(2), False, False, False, True(6), False, True(8), False],[False, True(1), False, False, True(4), True(5)), False, False, False, True(9)],[False, False, False, False, False, False, False, True(7), True(8), True(9)]]

col : col[j][d]=true   纵坐标作为 行 d作为列 

第一列   4 5  6 7 8

 [False, False, False, False, True(4), True(5), True(6), True(7), True(8), False]

[[False, False, False, False, True(4), True(5), True(6), True(7), True(8), False], 
[False, False, False, True, False, False, True, False, False, True], 
[False, False, False, False, False, False, False, False, True, False],[False, True, False, False, True, False, False, False, True, False],[False, True, True, False, False, False, True, True, True, True], 
[False, False, False, True, False, True, False, False, False, True],[False, False, True, False, False, False, False, False, False, False], 
[False, False, False, False, False, False, True, True, True, False], 
[False, True, False, True, False, True, True, False, False, True]]

   box :      k = (i // 3) * 3 + (j // 3)
                box[k][d] = True  # 第k 个箱子的d 是否存在

  例如  board[4][3]=8   k=(4//3)*3 +(3//1) =4  第4个子框  第8个标记为true

[[False, False, False, True, False, True, True, False, True, True], 
[False, True, False, False, False, True, False, True, False, True],[False, False, False, False, False, False, True, False, False, False], 
[False, False, False, False, True, False, False, True, True, False],[False, False, True, True, False, False, True, False, True(8), False], 
[False, True, False, True, False, False, True, False, False, False],[False, False, False, False, False, False, True, False, False, False],[False, True, False, False, True, False, False, False, True, True], 
[False, False, True, False, False, True, False, True, True, True]]

定义回溯

# 定义回溯def backtrack(pos):print("pos", pos)if pos == len(spaces):  # 当pos 等于spaces长度时候说明已经填写完 ,返回trueprint("结果", board)return Truei, j = spaces[pos]k = (i // 3) * 3 + (j // 3)for d in range(1, 10):  # 对这个位置尝试填充1-9if not row[i][d] and not col[j][d] and not box[k][d]:  # 满足为false 时候填入row[i][d] = Truecol[j][d] = Truebox[k][d] = Trueboard[i][j] = str(d)if backtrack(pos + 1):return True# 回溯row[i][d] = Falsecol[j][d] = Falsebox[k][d] = Falseboard[i][j] = '.'  # 恢复空格return Falsebacktrack(0)

代码 

class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""# 初始化三个数组row=[[False] *10 for _ in range(9)]col=[[False] *10 for _ in range(9)]box=[[False] *10 for _ in range(9)]spaces=[] # 记录空格位置# 遍历数组填充已经有的数字for i in range(9):for j in range(9):if board[i][j]!='.':d=int(board[i][j])row[i][d]=Truecol[j][d]=Truek=(i//3)*3+(j//3)box[k][d]=Trueelse:spaces.append((i,j)) # 记录空格的坐标def  backtrack(pos):if pos ==len(spaces):#遍历完了所有空格return Truei,j=spaces[pos] # 取出当前位置的空格坐标k=(i//3)*3+(j//3)for d in range(1,10):  # 尝试对该位置填充1-9if row[i][d]==False and col[j][d]==False and box[k][d]==False:row[i][d]=Truecol[j][d]=Truebox[k][d]=Trueboard[i][j]=str(d)if backtrack(pos+1):return True#不满足  回溯row[i][d]=Falsecol[j][d]=Falsebox[k][d]=Falseboard[i][j]='.' return Falsebacktrack(0)

http://www.dtcms.com/wzjs/793508.html

相关文章:

  • 怎么申请 免费网站有官网建手机网站吗
  • 制作动画的网站模板wordpress 全文字主题
  • 做图软件ps下载网站惠州专业网站建设公司哪里有
  • 环评登记表在哪个网站做优秀个人网站设计欣赏
  • 广州市专业做网站深圳市网站设计公
  • 中国航天科工集团有限公司seo整站优化推广
  • 建设网站计划 ppt重庆关键词快速排名
  • 网站建设公司厦门网站怎么提高权重
  • 全国培训加盟网站建设网站开发语言什么意思
  • 创建微网站建立wordpress网站
  • 常州网站建设智博html网页制作代码模板
  • 农业建设公司网站深圳专业网站制作费用
  • 古镇建设网站电子商务网站建设选择
  • 网站seo外链接一般建一个外贸网站多少钱
  • 做网站讯息jsp如何做网站界面
  • 梁头网站建设网站名称管理
  • 现在做网站到底需要多少钱wordpress 菜单 字体
  • 手机版oa系统下载北京知名seo公司精准互联
  • 开发seo平台优化
  • 有做浏览单的网站电子商务网站建设规划书实例
  • 建设电商网站需要什么硬件做传销一般是不是有网站
  • 四川人防工程建设网站房地产网站怎样建设才能快速盈利
  • 网站服务器失去响应怎么解决网站维护中 源码
  • 哪里有做网站设计广告平台有哪些 互联网
  • 沧州品牌网站建设wordpress都可以干什么
  • 建设网站是做什么同和网站建设
  • 做产品的淘宝客网站wordpress快速收录
  • 网站设计主题中文成都app开发外包
  • 苏州建站推广定制wordpress能采集
  • 昆明比较好的网站开发公司51我们一起做网站