1、什么是拉丁方阵
拉丁方阵是一种n*n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中恰好出现一次。著名的数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此得名。
2、问题求解
根据每种元素在一行和一列中恰好出现一次克制,一个3*3的拉丁方阵如下:
1 2 3
2 3 1
3 1 3
由上图可知,拉丁方阵相邻行的元素排列都是上行第二个元素在下一行排第一位。知道拉丁方阵的规律,就容易了。拉丁方阵的解法有很多种,本文使用链表作解,代码如下
package test.algorithm.FastSlowPointer;
/**
* 拉丁方阵
* @author serenity
*
*/
public class Latin {
public static void main(String[] args) {
//创建并初始化有5个节点的链表
Node header = null;
Node pointer = header;
for(int i=1;i<=5;i++){
Node temp = new Latin.Node(i);
if(header==null){
header = temp;
}else{
pointer.next = temp;
}
pointer = temp;
pointer.next = header;
}
System.out.print("创建5个节点的空链表:");
printList(header);
//输出拉丁方阵
pointer = header;
System.out.println("拉丁方阵:");
do{
// 每行链表都退一格打印
printList(pointer);
pointer = pointer.next;
}while(pointer!=null && pointer!=header);
}
static class Node {
private int num;
private Node next;
public Node(int num){
this.num = num;
}
}
/**
* 打印链表
* @param node
*/
static void printList(Node header){
Node pointer = header;
do{
System.out.print(pointer.num+" ");
pointer = pointer.next;
}while(pointer!=null && pointer!=header);
System.out.println();
}
}