#P11015. 数独
数独
题目背景
感谢知乎网友 Maxwell
的数独技巧介绍!
数独作为一种健康的益智游戏,是对人的智慧和毅力的考验,面对眼前不断出现的困难和挫折,能够勇敢地挑战自我,超越自我。
数独的基本做法是:根据 盘面上的已知数字,推理出所有剩余空格的数字,这些数字仅限 这九个数字。需要特别注意的是:每一行、每一列、每一宫( 空格)内的数字均包含 这九个数字。由于每一行、每一列或每个宫仅有 个空格,所以,每一行、每一列或每个宫不会出现重复数字。
对于下面的简单教程,注意以下三点:
- 为方便描述,以下将每一行、每一列或每个宫,统称为一个
基本单元
; - 图中,黄色为待填数字格,绿色框为目标区。上下图无关联,每张图均为展示一个技巧;
- 所示仅为解释所述技巧,不代表当前最佳解法。
下面介绍数独常用的两个技巧:排除法和唯余法。
一、排除法
对于一个基本单元,通过排除发现基本单元内未填写的某个数字只能填写到基本单元内的唯一一个格子里(对于基本单元内未填写的某个数字,考察基本单元内待填写的所有格子,排除那些不能填写的格子后发现只有唯一一个格子能填写该数字),那么可知这个特殊的格子必须填写该数字。具体还可以细分为以下几种情况(注意:编程时可以将这些情况作为一种情况统一处理):
二、唯余法
对于一个待填写的格子,统计这个格子所在行、列、宫内的所有已填写数字,如果发现已经出现了 个不同的数字,那么这个格子肯定只能填写未出现的那个数字。
题目描述
提供一个数独游戏的初始盘面,仅重复利用上面介绍的排除法和唯余法,输出最终能推导出的盘面。需要特别注意的是,这里最终能推导出的盘面并不一定表示所有格子都填写了数字。
输入格式
数独游戏的初始盘面,一共 行,每行是 个字符(只能是数字字符 0
~9
和小写字母 x
),每个字符间有一个空格,每行末尾没有空格。字符 x
表示盘面上该处未填写数字,其他数字字符表示盘面上对应位置的格子填写着对应的数字。
输出格式
输出仅重复利用上面介绍的排除法和唯余法得到的最终盘面,格式与输入格式相同。未能推导出结果的格子对应位置仍然输出小写字母 x
。
输入输出样例
x x x x x x x 2 x
x x 4 6 x x x x 3
6 x x x x x 1 x x
5 x x x 6 2 x x x
x 3 x x x x x 5 x
x x x x x x x 1 8
x x x 4 x x 2 x x
x 8 x x x x 4 3 7
x x 9 7 x x 8 x x
x x x x x x x 2 6
x x 4 6 x x x x 3
6 x x x x x 1 x x
5 x x x 6 2 x x x
x 3 x x x x x 5 2
x x x x x x x 1 8
x x x 4 x x 2 9 x
x 8 x x x x 4 3 7
x x 9 7 x x 8 6 x
说明/提示
👀️ 样例说明
对于初始盘面,这里先使用排除法,可知第 行第 列处只能填写数字 (对于第 列未出现的数字 ,考察第 列未填数字的所有格子:第 行 列、第 行 列这两个格子都不能填写,因为这两个格子所在的第 宫已经有数字 ;第 行 列格子不能填写,因为第 行已经有数字 ;第 行 列、第 行 列这两个格子都不能填写,因为这两个格子所在的第 宫已经有数字 。可知只剩下唯一的第 行第 列格子能填写数字 ),得到下面盘面:
x x x x x x x 2 x
x x 4 6 x x x x 3
6 x x x x x 1 x x
5 x x x 6 2 x x x
x 3 x x x x x 5 2
x x x x x x x 1 8
x x x 4 x x 2 x x
x 8 x x x x 4 3 7
x x 9 7 x x 8 x x
此时再继续使用排除法,无法进一步推导盘面任意一处格子的数字。换用唯余法,可知第 行第 列处只能填写数字 (考察第 行第 列格子所在行、列、宫,发现数字 这八个数字都出现了,只有数字 没有出现,所以此处只能填写数字 ),得到下面盘面:
x x x x x x x 2 x
x x 4 6 x x x x 3
6 x x x x x 1 x x
5 x x x 6 2 x x x
x 3 x x x x x 5 2
x x x x x x x 1 8
x x x 4 x x 2 x x
x 8 x x x x 4 3 7
x x 9 7 x x 8 6 x
此时再继续使用唯余法,无法进一步推导盘面任意一处格子的数字。换用排除法,可知第 行第 列处只能填写数字 (对于第 列未出现的数字 ,同样是考察第 列未填数字的所有格子:第 行 列格子不能填写,因为第 行已经有数字 ,第 行 列格子不能填写,因为第 行已经有数字 ;第 行 列、第 行 列这两个格子都不能填写,因为这两个格子所在的第 宫已经有数字 。可知只剩下唯一的第 行第 列格子能填写数字 ),得到下面盘面:
x x x x x x x 2 6
x x 4 6 x x x x 3
6 x x x x x 1 x x
5 x x x 6 2 x x x
x 3 x x x x x 5 2
x x x x x x x 1 8
x x x 4 x x 2 x x
x 8 x x x x 4 3 7
x x 9 7 x x 8 6 x
此时再继续使用排除法,无法进一步推导盘面任意一处格子的数字。换用唯余法,可知第 行第 列处只能填写数字 (考察第 行第 列格子所在行、列、宫,发现数字 这八个数字都出现了,只有数字 没有出现,所以此处只能填写数字 ),得到下面盘面:
x x x x x x x 2 6
x x 4 6 x x x x 3
6 x x x x x 1 x x
5 x x x 6 2 x x x
x 3 x x x x x 5 2
x x x x x x x 1 8
x x x 4 x x 2 9 x
x 8 x x x x 4 3 7
x x 9 7 x x 8 6 x
此时即使再继续使用排除法和唯余法,也无法进一步推导盘面任意一处格子的数字。
👀️ 对于的数据,保证提供的初始盘面在推导过程中一直满足数独的规则。