正文

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

            
        

阅读(4141) | 评论(0)


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

评论

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