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 24 Python
Python中的jquery PyQuery库使用小结
May 13 Python
Python实现建立SSH连接的方法
Jun 03 Python
六个窍门助你提高Python运行效率
Jun 09 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
Win8下python3.5.1安装教程
Jul 29 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 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 进行手机 APP 开发(API 接口开发)
2014/08/11 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
javascript读取xml
2006/11/04 Javascript
javascript编程起步(第六课)
2007/02/27 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
js函数般调用正则
2008/04/08 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
TypeScript入门-基本数据类型
2017/03/28 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
[09:59]DOTA2-DPC中国联赛2月7日Recap集锦
2021/03/11 DOTA
Python isinstance判断对象类型
2008/09/06 Python
python自然语言编码转换模块codecs介绍
2015/04/08 Python
Python进程间通信之共享内存详解
2017/10/30 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
python多线程分块读取文件
2019/08/29 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
Python字典底层实现原理详解
2019/12/18 Python
Keras 使用 Lambda层详解
2020/06/10 Python
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
数据库连接池的工作原理
2012/09/26 面试题
六查六看自查报告
2014/10/14 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python