拉丁方阵

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();
	}


}




转载于:https://my.oschina.net/u/140462/blog/277245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值