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使用post提交数据到远程url的方法
Apr 29 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
如何使用Python脚本实现文件拷贝
Nov 20 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 31 Python
使用Python解决图表与画布的间距问题
Apr 11 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实现mysql数据库备份类
2008/03/20 PHP
PHP在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
php array_unique之后json_encode需要注意
2011/01/02 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
javascript特殊用法示例介绍
2013/11/29 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
Vue分页效果与购物车功能
2019/12/13 Javascript
ML神器:sklearn的快速使用及入门
2019/07/11 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
初入社会应届生求职信
2013/11/18 职场文书
高一英语教学反思
2014/01/22 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
建筑工地文明标语
2014/10/09 职场文书
三方股份合作协议书
2014/10/13 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
解析MySQL binlog
2021/06/11 MySQL
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android