填数谜题里,一个空格能填哪些数字,首先受所在行列已经出现的数字限制。列出候选能帮助找下一步,但候选多于一个时并不代表随便选一个就一定能完成整题。
下面给出一组可以从头复算的练习数据。先按约定记录每一步,再比较最后的核对条件;遇到差异时,不急着修改答案,而是先找出从哪一步开始不同。本例描述的是明确限定的游戏规则模型,不代替某款作品自己的说明。
约定与输入
本例四行四列,每行每列都要求一到四各出现一次,没有额外宫格规则。各空格独立计算候选,不把前一格的猜测写回去,也不宣称本题有唯一解。
从1、2、3、4中排除同行和同列出现的所有非零数字;每格只用原始棋盘信息。
零表示空格,行列索引均从0开始 0 2 0 4 0 0 0 1 0 4 0 3 0 1 0 0
逐步观察
空格(行0,列0):本行已有[2, 4],本列已有[],候选[1, 3]。仍需其他线索进一步判断。
空格(行0,列2):本行已有[2, 4],本列已有[],候选[1, 3]。仍需其他线索进一步判断。
空格(行1,列0):本行已有[1],本列已有[],候选[2, 3, 4]。仍需其他线索进一步判断。
空格(行1,列1):本行已有[1],本列已有[1, 2, 4],候选[3]。当前只有一个候选。
空格(行1,列2):本行已有[1],本列已有[],候选[2, 3, 4]。仍需其他线索进一步判断。
空格(行2,列0):本行已有[3, 4],本列已有[],候选[1, 2]。仍需其他线索进一步判断。
空格(行2,列2):本行已有[3, 4],本列已有[],候选[1, 2]。仍需其他线索进一步判断。
空格(行3,列0):本行已有[1],本列已有[],候选[2, 3, 4]。仍需其他线索进一步判断。
空格(行3,列2):本行已有[1],本列已有[],候选[2, 3, 4]。仍需其他线索进一步判断。
空格(行3,列3):本行已有[1],本列已有[1, 3, 4],候选[2]。当前只有一个候选。
本轮单候选空格有2个;其余候选情况如上。
复核办法
把候选数字逐个临时放入目标格,检查该行与该列非空数字是否仍不重复。必须同时通过两项;只在一条轴上没出现的数字仍可能冲突。
填入确定值后,其他格的候选可能变少,但那属于下一轮更新。把本轮结果和下一轮结果混记,会让同一张题面似乎得到不同答案,因此记录时应注明是否已经提交了新数字。
把边界、顺序与适用范围写进记录,比只记一个最后数字更有用。可以另外构造刚好在边界、完全没有变化和多个条件同时成立的情况,查看规则是否仍自洽;若要改变设定,保留原案例作为对照,再重新计算受影响的部分。
