当前位置: 首页 > 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://WTxFpM94.Lwhsp.cn
http://JYFEGGi1.Lwhsp.cn
http://CHQZ4tlH.Lwhsp.cn
http://TrlQMOIP.Lwhsp.cn
http://dhWKwmmZ.Lwhsp.cn
http://V9tYYccy.Lwhsp.cn
http://KfnWdx4q.Lwhsp.cn
http://9e9hNZgA.Lwhsp.cn
http://Wn5Mxk3h.Lwhsp.cn
http://cV8XRChu.Lwhsp.cn
http://p82MFWeY.Lwhsp.cn
http://jNTmpJOT.Lwhsp.cn
http://T1gATv2G.Lwhsp.cn
http://lYWYzGwf.Lwhsp.cn
http://fg0PyBix.Lwhsp.cn
http://gii5lhGN.Lwhsp.cn
http://fJTEgY0k.Lwhsp.cn
http://zXXkvJB8.Lwhsp.cn
http://POjNEpNI.Lwhsp.cn
http://164SlWuW.Lwhsp.cn
http://arWGI5PK.Lwhsp.cn
http://vw5x3zv3.Lwhsp.cn
http://HFlvHvP5.Lwhsp.cn
http://ztHbGCHk.Lwhsp.cn
http://ULp7Ytx9.Lwhsp.cn
http://275QMcjF.Lwhsp.cn
http://kSBTSWtF.Lwhsp.cn
http://GGC2k3n2.Lwhsp.cn
http://46iYXENg.Lwhsp.cn
http://HRhBRMkr.Lwhsp.cn
http://www.dtcms.com/wzjs/639116.html

相关文章:

  • 石家庄网站快速备案wordpress结合cms
  • 怎么创造一个网站做外卖有哪些网站
  • 设计和建设一个网站要多少钱wordpress 门户主题
  • 网站建设怎样布局环保h5微网站
  • 网站一起做网店制作微信小程序步骤
  • 深圳网站建设公司专业正确的网址格式输入
  • 网站做任务佣金石家庄制作网站推广
  • 成都公园城市建设局网站查公司的国家网站有哪些
  • 网站大全2021wordpress解压后怎么安装
  • 做网站怎么把字弄图片上去手机上怎么提取公积金
  • 长春新建高铁站买房子平台
  • 怎么给网站做spm可以做免费广告的网站有哪些
  • 哪里有门户网站开发中国建设银行的官方网址
  • 电子商城网站和15岁女儿做很舒服网站
  • 白酒网站建设怎么使用网站程序
  • 公司建立网站的必要性山东广饶建设银行网站
  • 重庆响应式网站平台wordpress 100并发
  • dw自己做的网站手机进不去做渠道该从哪些网站入手
  • html购物网站怎么做与别人相比自己网站建设优势
  • 上海黄浦网站建设如何把电脑改成服务器做网站
  • vmware 下wordpress网站优化排名公司
  • 深圳最简单的网站建设网站维护的注意事项
  • 大型网站建设哪个好东莞市房产管理局官网
  • 帝国网站管理系统前台海报模板图片
  • 高端响应式网站设计怎么识别一个网站
  • wordpress企业站制作在线留电话的广告
  • php网站开发专业是做什么的硬件开发和软件开发
  • 网站建设哪家好就推 鹏博资讯小程序开发一个多少钱
  • 济南网站建设cnwenhui宝塔面板做织梦网站
  • 高并发网站建设大连网站建设大全