拉丁方是在X或Y列中没有重复符号的正方形。例如:
ABCD
DABC
CDAB
BCDA
是一个这样的广场。请注意,每一列和每一行如何包含相同的4个字母的排列。
但是,我们的拉丁方有一个问题: 如果我将第二行(DABC
)1向左旋转,我将得到ABCD
,这与上面的排列相同。 如果不可能旋转任何一列/行并获得另一列/行,那么我们认为正方形是旋转安全的。
例如:
ABCD
BDAC
CADB
DCBA
是旋转安全的。网格具有以下属性:
- 点[0,N]使用第N个符号
- 点[0,N]和[N,0]始终是相同的符号。(我也想说[x,y]和[y,x]也总是相同的字母,但我无法证明它)
您的任务是在传递N时打印出1个旋转安全的拉丁方格。 我不在乎是否输出字母,数字,列表或2D数组。 如果使用数字,则第一列和第一行必须是0,1,2,3,...
(按此顺序)。如果使用字母,则必须是A,B,C,D,....
例如,如果输入为4,则应打印:
0,1,2,3 0,1,2,3
1,3,0,2 or 1,0,3,2
2,0,3,1 2,3,1,0
3,2,1,0 3,2,0,1
没有大小小于4的旋转安全拉丁方。如果N小于4,我不在乎您的程序会做什么。出于好奇,旋转安全方数为(从4开始): 2,5,5906,(too long to calculate)
这是一个代码问题,所以请尝试使用您喜欢的语言尽可能短地回答!
没有时间限制,但是您的解决方案一定可以终止。
—
内森·美林
对于1索引语言,第一行可以
—
英里
1,2,3,...
吗?
@miles是的,很好
—
Nathan Merrill
N
由于随机数质量不足而不能在技术上保证以较高的值终止它们,是否允许使用Monte Carlo方法?)