在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅
出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
这个算法和第一个差不多,每种可能都进行筛选,不过可能性更多,应该是N^(N*N)个吧。而且不能用上面那种笨办法了,循环N*N次,N都不能固定。只好按照回溯算法构造一个树出来,这个树应该是N*N层,每个父结点有N个子结点。遍历树的时候子结点是动态增加或删除的,hoho,要不然太占内存了也。
N=5的时候,实测了一下,总共有个161280拉丁方阵,在我的破T61上计算耗时7s,还过得去;N=6的时候就没耐心了. N=10的话,算了N久也没算完,总个数用64位好像都未必够,没兴趣了的说。
C++代码: