30 有效的数独
https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/30/
写一下题目吧
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.'
表示。
翻译一下这道题目的条件:
- 同样的i下标里不能有两个相同的数,
- 同样的j坐标里不能有两个相同的数,
- i/3,j/3的值相同的这个范围里,也不能有两个相同的数。
我觉得根据数字比较下标会是一个比较省心且直观的方式。
遍历数组,把所有的有数字的格子的坐标都保存下来,
由于这题的数字是0-9,正好也省去了我们用hashmap的麻烦,直接用个数组搞定。
再次遍历数组.....等等,用不着啊,在第一次遍历的时候直接就可以判断起来了。
假如有当前数字的坐标记录,就去比较一下是否满足条件。假如没有当前数字的坐标记录,就把当前坐标存下来,继续遍历。
一旦发现不合规的,就返回false,结束循环,妥妥的。
# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
i=0
j=0
rec = []
hash = {}
for i in 0..8
for j in 0..8
next if board[i][j]=='.'
r = rec[board[i][j].to_i]
if r
r.each_with_index do |e, idx|
x,y = e[0],e[1]
if x==i||y==j||(x/3==i/3 && y/3==j/3)
return false
end
end
r.push [i,j]
else
rec[board[i][j].to_i] = [[i,j]]
end
end
end
return true
end