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实现定时自动给微信好友发送天气预报
Oct 25 Python
Python基于百度云文字识别API
Dec 13 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
基于python实现把图片转换成素描
Nov 13 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
django 取消csrf限制的实例
Mar 13 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
Python的scikit-image模块实例讲解
Dec 30 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 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
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
原生js 实现表单验证功能
2021/02/08 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python设置值及NaN值处理方法
2018/07/03 Python
django2.0扩展用户字段示例
2019/02/13 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
python全栈开发语法总结
2020/11/22 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
就业推荐表自我鉴定
2013/10/29 职场文书
预备党员思想汇报范文
2014/01/11 职场文书
一句话工作感言
2014/03/01 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
2014年工程部工作总结
2014/11/25 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
高中美术教学反思
2016/02/17 职场文书
Mysql数据库命令大全
2021/05/26 MySQL
win10清理dns缓存
2022/04/19 数码科技
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技