Python判断有效的数独算法示例


Posted in Python onFebruary 23, 2019

本文实例讲述了Python判断有效的数独算法。分享给大家供大家参考,具体如下:

一、题目

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

1. 数字 1-9 在每一行只能出现一次。
2. 数字 1-9 在每一列只能出现一次。
3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

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

例1:

输入:
[
["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"]
]
输出: true

例2:

输入:
[
["8","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"]
]
输出: false

解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。

但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

二、解法

  • 先创建三个空数组 row、col、cell,以 cell 为例,里面的每个空字典都代表一个 3×3单元格,然后我们需要把数据一个个填进去
  • 遍历整个二维数组,然后边遍历边把数组分别存入到 行 row , 列 col , 3×3单元格 cell 内的字典,存为key ,而不是 value 。
  • 然后我们就可以判断,行、列、3×3单元格 对应的字典内是否已经存在board[x][y]这个键名,如果存在,那么说明重复了,返回 False
  • 注意,字典中的值这里都为1,但是没有任何意义,你可以随意更改
  • 把数组存入 3×3的单元格是一个难点,num = 3*(x//3)+y//3,这个式子是关键,可以找个数独,然后代入进去好好理解下
  • 当然你也可以不用这个式子,用if/else语句来判断也行,那样比较好理解,但是不如这个式子简洁
  • 类似于: if y<3 : ... elif 3<=y<6 : ... elif 6<=y : ...,

代码如下:

#row,col,cell分别代表行,列,3x3单元格
row, col, cell =
[{}, {}, {}, {}, {}, {}, {}, {}, {}],
[{}, {}, {}, {}, {}, {}, {}, {}, {}],
[{}, {}, {}, {}, {}, {}, {}, {}, {}]
for x in range(9):
  for y in range(9):
    #取得单元格
    num = 3*(x//3)+y//3
    temp = board[x][y]
    #不需要存入 '.'
    if temp != '.':
      if (temp not in row[x]
      and temp not in col[y]
      and temp not in cell[num]):
        row[x][temp] = '1'
        col[y][temp] = '1'
        cell[num][temp] = '1'
      else:
        return False
return True

时间 64ms,击败了 99.3%

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
详解Python网络爬虫功能的基本写法
Jan 28 Python
浅谈numpy数组中冒号和负号的含义
Apr 18 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
Python selenium爬虫实现定时任务过程解析
Jun 08 Python
Python自带的IDE在哪里
Jul 01 Python
Python3爬虫中Ajax的用法
Jul 10 Python
Python使用scapy模块发包收包
May 07 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 Python
Python实现的旋转数组功能算法示例
Feb 23 #Python
Python实现求两个数组交集的方法示例
Feb 23 #Python
Python神奇的内置函数locals的实例讲解
Feb 22 #Python
Python玩转Excel的读写改实例
Feb 22 #Python
Python操作配置文件ini的三种方法讲解
Feb 22 #Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 #Python
python调用虹软2.0第三版的具体使用
Feb 22 #Python
You might like
PHP日期处理函数 整型日期格式
2011/01/12 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
PHP生成plist数据的方法
2015/06/16 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
JSON 编辑器实现代码
2009/12/06 Javascript
jquery blockUI 遮罩不能消失与不能提交的解决方法
2011/09/17 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
django中模板的html自动转意方法
2018/05/27 Python
Flask-Mail用法实例分析
2018/07/21 Python
python实现人工蜂群算法
2020/09/18 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
python tqdm库的使用
2020/11/30 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
团委竞选演讲稿
2014/04/24 职场文书
代办委托书怎么写
2014/08/01 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript
为Centos安装指定版本的Docker
2022/04/01 Servers
Go获取两个时区的时间差
2022/04/20 Golang