2005年9月5日第35期电脑报编程点将台 题目:构造N*N阶的拉丁矩阵(2<=N<=9),使方阵中的每一行和每一列中的数字1到N只出现一次。如N=4时: 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 我的程序: /*算法思想: 通过观察,我们可以发现规律就是:第一行从1开始递增直到n, 第二行从2开始递增,当超过n是就得到其与n的模加上1即可, 以此类推直到完成所有的排列。 我的程序的问题:没有考虑所有可能的情况,只是根据已有的得出规律 其实相当于是不完全归纳法。不过,要是想得出所有可能的情况的时间复杂度将比较大 */ #include<iostream> using namespace std; void main() { int i,j,n; const int maxsize=9; int AA[maxsize][maxsize]; cin>>n; if(n<2||n>9) { cout<<"You are wrong!"; return ; } for(i=0;i<n;i++)//初始化 for(j=0;j<n;j++) AA[i][j]=(i+j+1>=n+1)?(i+j+1)%(n+1)+1:(i+j+1)%(n+1); for(i=0;i<n;i++)//输出 { for(j=0;j<n;j++) cout<<AA[i][j]<<" "; cout<<"\n"; } } 这题其实在我C程序设计百例里面的58题就是,为了比较学习的方便,我把里面的程序一起帖出来比较一下。 *问题分析与算法设计 构造拉丁方阵的方法很多,这里给出最简单的一种方法。观察给出的例子,可以发现:若将每 一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由1到N顺序构成;对于第i行,这个环的开始数字为i。按照 此规律可以很容易的写出程序。下面给出构造6阶拉丁方阵的程序。 *程序与程序注释 #include<stdio.h> #define N 6 /*确定N值*/ void main() { int i,j,k,t; printf("The possble Latin Squares of order %d are:\n",N); for(j=0;j<N;j++) /*构造N个不同的拉丁方阵*/ { for(i=0;i<N;i++) { t=(i+j)%N; /*确定该拉丁方阵第i 行的第一个元素的值*/ for(k=0;k<N;k++) /*按照环的形式输出该行中的各个元素*/ printf("%d",(k+t)%N+1); printf("\n"); } printf("\n"); } } *运行结果 The possble Latin Squares of order 6 are: 1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3 3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4 4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5 5 6 1 2 3 4 6 1 2 3 4 5 1 2 3 4 5 6 6 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 1 4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5 5 6 1 2 3 4 6 1 2 3 4 5 1 2 3 4 5 6 6 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 1 1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3 3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4

评论