会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
盘面边长 s 只取 4、9、16。0 是待填的格子,其余整数从 1 取到 s。每一条横行、每一条竖列,以及边长为 s 的小宫里,数字都不能重复。合法填法恰好一组时输出整盘;一组都没有,或者多于一组,都只输出 0。
- 用三个位掩码记下每一行、每一列、每一个小宫已经用过的数字。掩码的第 d−1 位对应数字 d。
- 先放入给定数字。数值越界,或者同一行、同一列、同一个小宫里重复,就没有解。
- 每次在还空着的格子里选候选最少的一个。候选是行、列、小宫都还没用到的数字,按从小到大尝试:填上,更新掩码,递归,再把格子和掩码撤掉。
- 一旦得到第二组完整填法就停止。最后恰好一组才输出这张盘,否则输出 0。
- 小宫编号是 ⌊r/b⌋⋅b+⌊c/b⌋,其中 b=s,行号和列号都从 0 计。盘面已经填满而且没有冲突时,搜索直接得到这一组,原样输出。