拉丁方陣(英語:Latin square)是一種 n × n 的方陣,在這種 n × n 的方陣里,恰有 n 種不同的元素,每一種不同的元素在同一行或同一列里只出現一次。以下是兩個拉丁方陣舉例:
拉丁方陣有此名稱是因為瑞士數學家和物理學家歐拉使用拉丁字母來做為拉丁方陣里的元素的符號。
算法步驟:
- 在第一行中,數字從 1 到 n 連續存儲。
- 第二行,數字向右移動一列。即 1 現在存儲在第二列,依此類推。
- 在第三行中,數字向右移動兩列。即 1 現在存儲在第三列,依此類推。
- 對於其余的行,我們將以相同的方式繼續。
1 package algorithm; 2 3 /** 4 * 拉丁方陣 5 */ 6 public class LatinSquare { 7 /** 8 * 打印拉丁方陣 9 * 10 * @param n 方陣邊長 11 */ 12 private static void printLatin(int n) { 13 int k = n + 1; 14 15 // row 16 for (int i = 1; i <= n; i++) { 17 int temp = k; 18 19 while (temp <= n) { 20 System.out.print(temp + " "); 21 temp++; 22 } 23 24 // 每行后面補 1...k-1 25 for (int j = 1; j < k; j++) { 26 System.out.print(j + " "); 27 } 28 29 k--; 30 System.out.println(); 31 } 32 } 33 34 public static void main(String[] args) { 35 int n = 5; 36 printLatin(n); 37 } 38 }
關於拉丁方陣的一些內容:
拉丁方陣的正交
設有兩個階數相同(為)的拉丁方陣,其中將所有放置位置相同的元素組合成一個元組,組合成一個新的矩陣
。 當這個新的矩陣
中每一個元素互不相同時,拉丁方陣
和
是互相正交的。 此時,
和
即為一對正交拉丁方。 而在階數固定的情況下,所有兩兩正交的拉丁方所成的集合稱為正交拉丁方族。
如當 n=3 時,存在兩個正交的拉丁方。
拉丁方陣的數量
可能有不止一種可能的拉丁方形。
目前,沒有公式可以計算 n × n 的拉丁方陣的數量,而當前最精確的公式在當 n 很大時,拉丁方陣的數量的最精確的估計值,其上下界也相差很遠。 具體估計公式為: