正文

2005年9月5日第35期电脑报编程点将台2005-09-10 18:44:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/4575.html

分享到:

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                      

阅读(15795) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册