#P17552. PM3000 希尔伯特抖动
PM3000 希尔伯特抖动
题目描述
抖动(Dithering)是一种图像处理方法:将使用较多颜色层级表示的位图,转换为使用较少颜色层级表示、但视觉效果尽量接近原图的位图。
现在需要把一幅具有 个灰度级的正方形灰度图,转换成一幅只有黑、白两种颜色的图像。
输入灰度图中的每个像素使用一个英文字母表示:
a、b、c、……、z分别对应灰度值 ;A、B、C、……、Z分别对应灰度值 。
输出图像中只会出现:
B:表示黑色,灰度值为 ;W:表示白色,灰度值为 。
本题采用一种沿 Hilbert 空间填充曲线遍历像素的误差扩散方法。
设图像边长为 。保证 是 的幂,并且 。Hilbert 曲线由水平线段和竖直线段组成,它会访问这个 网格中的每个像素恰好一次。
其递归构造如下图所示:

最小的情形是 网格,此时 Hilbert 曲线形如一个顶部开口的“杯子”,由三条线段组成。
构造 网格中的 Hilbert 曲线时,可以把 网格中的每个格子再细分成一个 子网格,然后按照图中所示的方向放置并连接四条子曲线。
构造更大的 Hilbert 曲线时继续递归进行相同操作。例如, 的曲线由四个经过适当旋转和连接的 子曲线组成。
在本题中,Hilbert 曲线从图像的左上角像素开始,最终到达右上角像素。
处理过程中只保留最近一个像素产生的误差。初始时误差值为 。沿 Hilbert 曲线依次访问每个像素,对当前像素执行以下操作:
- 将当前误差加到该像素原本的灰度值上。
- 如果结果小于 ,则将其改为 ;如果结果大于 ,则将其改为 。
- 如果处理后的灰度值不超过 ,则对应的输出像素设为
B;否则设为W。 - 用“处理后的源像素灰度值减去输出像素灰度值”作为新的误差。其中
B的灰度值为 ,W的灰度值为 。 - 沿 Hilbert 曲线继续访问下一个像素。
当右上角的最后一个像素处理完毕后,整个转换过程结束。
请输出转换后的黑白图像。
输入格式
第一行输入一个整数 ,表示灰度图的边长。
接下来输入 行灰度图。第 行包含一个长度恰为 的字符串,表示灰度图的第 行。字符串中不含空格,每个字符均为 a~z 或 A~Z。
因此,一组输入共包含 行:
n
第 1 行灰度图
第 2 行灰度图
...
第 n 行灰度图
输出格式
第一行输出整数 。这一行属于本题实际评测输出格式,必须输出。
接下来输出 行转换后的黑白图。第 行包含一个长度恰为 的字符串,且只包含字符 B 和 W,表示结果图像的第 行。
因此,一组输出共包含 行:
n
第 1 行黑白图
第 2 行黑白图
...
第 n 行黑白图
其中:
B表示黑色,灰度值为 ;W表示白色,灰度值为 。
样例 1
输入
2
ab
cd
输出
2
BB
BB
样例 2
输入
4
abcd
efgh
ijkl
mnop
输出
4
BBWB
BBBB
BBBB
WBWB
样例 3
输入
8
abcdefgh
ijklmnop
qrstuvwx
yzABCDEF
GHIJKLMN
OPQRSTUV
WXYZabcd
efghijkl
输出
8
BBBBBBBB
BBBWBWWB
BWBWBBWB
BBWBWWBW
WWBWWBWB
WBWWWWWW
WWWWBBBB
BBBBBBWB
样例 4
输入
16
abcdefghijklmnop
qrstuvwxyzABCDEF
GHIJKLMNOPQRSTUV
WXYZabcdefghijkl
mnopqrstuvwxyzAB
CDEFGHIJKLMNOPQR
STUVWXYZabcdefgh
ijklmnopqrstuvwx
yzABCDEFGHIJKLMN
OPQRSTUVWXYZabcd
efghijklmnopqrst
uvwxyzABCDEFGHIJ
KLMNOPQRSTUVWXYZ
abcdefghijklmnop
qrstuvwxyzABCDEF
GHIJKLMNOPQRSTUV
输出
16
BBBWBBBBBBBWBBBW
WBBBBWBWWBWBBWBW
BWBWBWWWWWWBWWWW
WWWWBBBBBBBWBBBB
BWBBWBWBWBWBWBBW
WBWWBWBWBWBWBWWW
BWBWWWWWBBBBBWBB
BBWBBBWBBWBWBBWB
WWBWBWBWBWBWWBWW
WBWWWWWWWWWWBBBB
BWBBWBBWBWBWBWBW
BBBWBBWBWBWBWBWB
WWWWBWWWBWWWWWWW
BBBBBBBBBBBWBBWB
BBBBWBWWWWBBWBWB
WWWWBWWBWBWWWWWW
数据范围
- ,其中 ;
- 每个输入字符串的长度均为 ;
- 输入字符只可能是
a到z或A到Z。