算法:拉丁方阵(Latin Square)

  拉丁方阵(英语: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 很大时,拉丁方阵的数量的最精确的估计值,其上下界也相差很远。 具体估计公式为: 

原文地址:https://www.cnblogs.com/magic-sea/p/12111763.html

时间: 2024-11-07 13:52:59

算法:拉丁方阵(Latin Square)的相关文章

魔术师发牌和拉丁方阵

本文利用经典的魔术师发牌问题与拉丁法阵分别解说了循环链表与单向链表的使用,作为算法中的经典,对于链表的学习和理解都有着非常大的帮助,最好还是一看. 魔术师发牌问题 问题描写叙述: 魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下.对观众说:"我不看牌,仅仅数数就能够猜到每张牌是什么,我大声数数,你们听,不信?现场演示."魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2,将第一张牌放在这些牌的以下,将第二张牌翻过来,正好是黑桃2

拉丁方阵的一些思考

问题: 拉丁方阵(英语:Latin square)是一种 \(n × n\) 的方阵,在这种 $n × n \(的方阵里,恰有\) n $种不同的元素,每一种不同的元素在同一行或同一列里只出现一次. \[ \begin{bmatrix} 1&2&3 \\\ 2&3&1 \\\ 3&1&2 \end{bmatrix} \begin{bmatrix}a&b&d&c \\\ b&c&a&d \\\ c&d&a

拉丁方阵问题

问题描述: 拉丁方阵是一种n×n的方阵,方阵中恰有n中不同的元素,每种元素恰有n个,并且每种元素在一行和一列中恰好出现一次.著名数学家和物理学家欧拉使用拉丁字母来做为方阵里元素的符号,拉丁方阵因此而得名. 问题分析: 用循环链表来实现 实现代码(c): #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; }Node; typedef struct Node *

魔术师发牌问题和拉丁方阵问题

魔术师发牌问题 问题描述: 魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下.对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示.”魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2,将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上这样依次进行将13张牌全部翻出,准确无误. 问题:牌的开始顺序是如何安排的? 思路就是用一个循环链表来解决问题, 初始化一个长度为13的循环链表,

小猪的数据结构辅助教程——2.6 经典例子:魔术师发牌问题和拉丁方阵问题

小猪的数据结构辅助教程--2.6 经典例子:魔术师发牌问题和拉丁方阵问题 标签(空格分隔): 数据结构 本节引言: 本节继续带来的是循环链表的两个经典例子,分别是魔术师发牌问题和拉丁方阵问题! 1.魔术师发牌问题 问题描述: 魔术师利用一副牌中的13张黑桃牌,预先将他们排好后叠放在一起,牌面朝下.对观众说:"我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示."魔术师将牌堆最上面的哪张排数为1,把他翻过来正好是黑桃A,将黑桃A从牌堆抽出放在桌子上,第二次数1.2

拉丁方阵问题 -- python实现

问题描述 拉丁方阵是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,而且每种元素在一行和一列中 恰好出现一次.著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此而得名. 比如: 1 2 3 2 3 1 3 1 2 问题:怎样构造N阶拉丁方阵? 列表 def solution_list(n): for y in range(n): for x in range(n): num = (y + x) % n + 1 print(f'{num} ', end=''

LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形,则返回True,否则返回False.例如: 输入:16 输出:true 输入:14 输出:false 注意:不要使用任何内置库函数,例如sqrt. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 暴力解法

拉丁方阵

http://codeup.cn/problem.php?id=22110 AC_Code 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=105; 5 int n,a[maxn],b[maxn][maxn]; 6 7 int main() 8 { 9 cin>>n; 10 for(int i=0;i<n;i++) cin>>a[i

算法之美_源代码发布(3)

本文辑录了<算法之美--隐匿在数据结构背后的语言>(电子工业出版社2016年出版)一书第4章之代码(P91~P117).全文目录."45个算法"目录."22个经典问题目录",以及有奖捉虫活动详情请见如下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题参考答案请见: http://blog.csdn.net/baimafujinji/article/det