判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字1-9在每一行只能出现一次。
数字1-9在每一列只能出现一次。
数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用'.'表示。
示例 1:
输入
示例 2:
输入:
输出:false解释:除了第一行的第一个数字从 5改为8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
说明:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字1-9和字符'.'。
给定数独永远是9x9形式的。
读题读题:读不下去了,什么玩意啊,没见过啊,给一个由列表组成的列表,然后返回真假。
有心搞一个随机算法,随机返回0,1。也就是传说中的猴子算法,如果样例不多完全可行,我甚至用这个方法解决点触验证码,活该找不着工作。
沉下心来思考,这是基础题,不会难的,首先解决一个问题,什么是数独?这个不知道这题不用做了。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
嗯,9*9的数独,那就是9个宫,题里由数字和逗号组成,如果全在,那就是123456789,
没有0,九个数字,那就是
我们要判断每一行中现有数字有没有重复的,每一列中数字有没有重复的,每一宫中有没有重复的,每个列表在都包含数字和字符点,我们要判断数字重复首先就要去除干扰项点,
行判断:a = 100 设置一个初始值
for i in range(len(board): 每个列表是一行
for j in range(len(board[i])): 遍历每一行 必须要有【:】 每次提取i的一个复制,然后对i操作
if board[i][j] == '.': 判断元素是不是点
board[i][j] = a
a += 1
不用去除的方法,去除后元素位置还都变了,将所有点都变成不同的数字,设置一个初始值a = 100,每当遇到空白符号就将其变成a,a自增1.
这样就完成了预处理,然后开始判断,每一个区域都是9个元素组成,如果有重复的,那么这个数独为假,用set方法去重判断长度是否变化
for i in range(9):
b = [ ] 完成一列清空一列
行 if len(set(board[i]) != 9:
rreturn 0
列 for j in range( 9):
b.append(board[j][i]) 每一列组成一个列表
if len(set(b)) !=9:
return 0
然后是对每个宫组成列表,观察规律,a00a01a02a10a11a12a20a21a22
那就是横竖都遍历0到2,所有宫都是差3,
横着数3个宫,竖着数3个宫,我僵住了,好难啊
找到九个基准点
22,25,28,52,55,58,82,85,88,没什么用,做减法更难
00,03,06,30, 33,36,60,63,66
居然搞了3层for,都不如手写九个列表
3层不行就4层,我真是个人才
开干
通过470个样例,那我大体方法应该没错,那就是数独还有什么条件没注意到
观察一下,宫三处有两个1,然后找宫的问题,嗯,NB,for我能写成if,改正!!!!!
四层for循环能这样,看样子我没什么问题,学习一下别人的。
太长了,感觉就是繁琐,虽然整体不大,行9个列表,列九个列表,宫9个列表,一共纯手写也就27个,运行时间可能更短,但构造列表的方法是重要的。并且应该花时间深入了解一下字典,看别人用的不少,没感觉到有什么优势,但也要学习一下。