C语言编程构造拉丁方阵和正交拉丁方阵组
小编今天要给大家带来的教程是:运用C语言制作拉丁方阵的方法。在这篇教程中,小编以三个部分来进行讲述,分别是提出问题,问题分析以及程序编码这三部分,希望这篇教程可以帮助到大家。
在教程开始之前,小编先给大家普及一下拉丁方阵的概念吧。其实它是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中恰好出现一次。著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此而得名。
1、提出问题
首先我们提出的问题就是:要利用C语言制作出一个NXN阶的拉丁方阵(条件是:2<=N<=9),让这个拉丁方阵中的每一列以及每一行中数字1到N仅仅只出现一次而已。就比如说N=4的时候,具体的拉丁方阵如下图:
2、分析问题和设计算法
其实制作出一个拉丁方阵的方法还是有很多种的,但是在这里小编只为大家介绍一种最简单最直接的方法。如果大家有兴趣的话,可以上网参考其他的实现方法。大家可以认真的观察一下小编所给出的例子,应该不难可以发现一点:那就是如果把每一行中第一列的数字以及最后一列的数字相连接起来的话,可以构造成为一个环,然而这个环刚刚好久是从1到N的顺序构成;对于第i行,i是这一个环的开始数字。没错,我们只要按照这个规律就可以非常容易的编写出程序了。那么现在小编就给大家制作出一个6阶拉丁方阵的程序吧,具体的源代码请接着看下文。
3、源代码注释和说明
下面的源代码就是一个6阶拉丁方阵的程序,大家可以参考一下。如下图:
通过上面的编程以后,相信大家在心底里面有一个答案了吧。那么现在我们就来看一下运行出来的结果吧,看一下你是否正确了呢?最终的结果如下:
小编结语:
在这篇教程中,小编主要是向大家介绍一下运用C语言制作拉丁方阵的实现方法。其实方法相对来说,还是比较简单的。希望大家可以跟着小编一起来动手去制作一下,毕竟读万卷书不如走万里路,实践才是真理哟!
拉丁方阵(非正交拉丁方阵)
#include<iostream>
#include<string>
#include<string.h>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,i,j;
int Num[20];
cout<<"请输入方阵维数:";
cin>>n;
for(i=1;i<=2*n;i++) //给数组赋初始值
{
if(i > n)
{
Num[i-1]=i-n;
}
else Num[i-1]=i;
}
for (i = 0;i < n;i++) //外循环保证输出n行
{
for (j = i;j < n+i;j++) //内循环输出一行的每个数字
{
cout<<Num[j]<<'\t';
if(j==n+i-1)cout<<'\n';
}
}
return 0;
}
拉丁方阵:
据说普鲁士的腓特列大帝曾组成一支仪仗队,仪仗队共有36名军官,来自6支部队,每支部队中,上校、中校、少校、上尉、中尉、少尉各一名。他希望这36名军官排成6×6的方阵,方阵的每一行,每一列的6名军官来自不同的部队并且军衔各不相同。令他恼火的是,无论怎么绞尽脑汁也排不成。
后来,他去求教瑞士著名的大数学家欧拉。欧拉发现这是一个不可能完成的任务。
来自n个部队的n种军衔的n×n名军官,如果能排成一个正方形,每一行,每一列的n名军官来自不同的部队并且军衔各不相同,那么就称这个方阵叫正交拉丁方阵。欧拉猜测在
n=2,6,10,14,18,…
时,正交拉丁方阵不存在。然而到了上世纪60年代,人们用计算机造出了n=10的正交拉丁方阵,推翻了欧拉的猜测。现在已经知道,除了n=2,6以外,其余的正交拉丁方阵都存在,而且有多种构造的方法。
正交拉丁方阵每个元素有2个属性。
Aa | Bc | Cb |
Bb | Ca | Ac |
Cc | Ab | Ba |
若只有一个属性则不是正交拉丁方阵。