源于面试的一个问题,在leetcode里也有这道题,参考站内的一篇文章。
首先此问题的分析需要满足三个约束条件:
- 每行不能有重复的数
- 每列不能有重复的数
- 每个3*3的方格中不能有重复的数
其中前两个约束条件都是容易满足的,关键在第三个。
使用三个与数独相同尺寸的二维数组,作为visited的tag,分别记录行、列和3*3方格的数据。
关键在于上述的16行代码,接下来将详细分析:
首先i / 3 和 j / 3会将当前的位置映射到33小方格里,也即判断当前的数据属于哪个3 * 3小方格(分别表示行和列信息),将其转化为index也即i / 3 * 3 + j / 3。
位操作的方案类似,就是用位操作代替了数组操作从而提高了存储效率。