挑战
给定具有相同宽度和高度的彩色光栅图像*,输出在Arnold猫图下转换的图像。(*详细信息见下文)
定义
给定图像的大小,N
我们假定像素的坐标由0
和之间的数字给出N-1
。
然后定义阿诺德的猫图如下:
坐标[x,y]
处的像素移动到[(2*x + y) mod N, (x + y) mod N]
。
这只是圆环上的线性变换:由于,黄色,紫色和绿色部分被映射回初始正方形mod N
。
该地图(我们称之为f
)具有以下属性:
它是双射的,意味着可逆:这是矩阵的线性变换
[[2,1],[1,1]]
。由于它具有行列式1
且仅具有整数项,因此逆数也仅具有整数项并由给出[[1,-1],[-1,2]]
,这意味着它在整数坐标上也是双射的。它是图像双射图组中的一个扭转元素
N x N
,这意味着如果将其应用足够多次,您将获得原始图像:f(f(...f(x)...)) = x
保证将图应用于自身导致身份的次数减少或等于3*N
。在下面的内容中,您可以看到经过多次重复应用Arnold的cat map之后的猫的图像,以及重复应用的外观的动画:
细节
您的程序不必一定要处理图像,但是2D数组/矩阵,字符串或类似的2D结构也是可以接受的。
您的
(0,0)
点位于左下角还是左上角都没关系。(或在其他任何角落,如果使用您的语言更方便)。请指定您在提交中使用的约定。
测试用例
矩阵形式([1,2,3,4]
是第一行,1
具有index (0,0)
,2
具有index (1,0)
,5
具有index (0,1)
)
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
maps to:
1 14 11 8
12 5 2 15
3 16 9 6
10 7 4 13
--------------------
1 2 3
4 5 6
7 8 9
map to:
1 8 6
9 4 2
5 3 7
作为图片(左下方是(0,0)
):