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爬虫使用Selenium模拟浏览器行为
Feb 23 Python
python表格存取的方法
Mar 07 Python
pandas ix &amp;iloc &amp;loc的区别
Jan 10 Python
python 自定义对象的打印方法
Jan 12 Python
Python OpenCV利用笔记本摄像头实现人脸检测
Aug 20 Python
python实现五子棋小程序
Jun 18 Python
pandas DataFrame创建方法的方式
Aug 02 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
20行Python代码实现视频字符化功能
Apr 13 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
python 批量下载bilibili视频的gui程序
Nov 20 Python
python turtle绘图
May 04 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
Python 数据结构之旋转链表
2017/02/25 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
python与字符编码问题
2019/05/24 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
什么是Python中的顺序表
2020/06/02 Python
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
药学职务聘任书
2014/03/29 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
小学课外阅读总结
2014/07/09 职场文书
学校工作推荐信范文
2014/07/11 职场文书
投资入股合作协议书
2014/10/28 职场文书
给老婆的道歉信
2015/01/20 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python