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中的装饰器详解
Apr 13 Python
Python中的filter()函数的用法
Apr 27 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
浅谈python字符串方法的简单使用
Jul 18 Python
浅析PHP与Python进行数据交互
May 15 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
python提取包含关键字的整行数据方法
Dec 11 Python
Python 一句话生成字母表的方法
Jan 02 Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 Python
用python批量下载apk
Dec 29 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面向对象分析设计的经验原则
2008/09/20 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php验证是否是md5编码的简单代码
2014/04/01 PHP
PHP中的session安全吗?
2016/01/22 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
如何让页面加载完成后执行js
2013/06/26 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python中的reduce内建函数使用方法指南
2014/08/31 Python
python计算对角线有理函数插值的方法
2015/05/07 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
实用求职信范文分享
2013/12/25 职场文书
年度评优评先方案
2014/06/03 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL