c语言二维数组之拉丁方阵

拉丁方阵

描述

一个N×N的拉丁方阵中含有整数1-N,且在任意的行或列中都不出现重复数据。

该拉丁方阵的产生方法是:当给出第一行含有整数1-N的N个数据序列后,就决定了各数在以下各行的位置,即第一行数为各数在每行中列数的索引表。首先找到某个数在N个数据序列中的位置(下标),然后以此数在序列中的位置为起始,按照数据序列的顺序可以得到该数在后面N-1行中的位置。

比如输入序列为:6 3 1 4 2 5

在这个序列中,整数1所在的下标为3,在上述序列中从3开始,序列循环依次为3,1,4,2,5,6,因此在方阵的第1行到第6行中,1的位置分别在第3,1,4,2,5,6列。

同理:

在这个序列中,整数2所在的下标为5,在上述序列中从5开始,序列循环依次为5,6,3,1,4,2,因此在方阵的第1行到第6行中,2的位置分别在第5,6,3,1,4,2列。

在这个序列中,整数3所在的下标为2,在上述序列中从2开始,序列循环依次为2,5,6,3,1,4,因此在方阵的第1行到第6行中,3的位置分别在第2,5,6,3,1,4列。

在这个序列中,整数4所在的下标为4,在上述序列中从4开始,序列循环依次为4,2,5,6,3,1,因此在方阵的第1行到第6行中,4的位置分别在第4,2,5,6,3,1列。

在这个序列中,整数5所在的下标为6,在上述序列中从6开始,序列循环依次为6,3,1,4,2,5,因此在方阵的第1行到第6行中,5的位置分别在第6,3,1,4,2,5列。

在这个序列中,整数6所在的下标为1,在上述序列中从1开始,序列循环依次为1,4,2,5,6,3,因此在方阵的第1行到第6行中,6的位置分别在第1,4,2,5,6,3列。

根据上述分析可得到的拉丁方阵如下:

6 3 1 4 2 5

1 4 5 6 3 2

5 6 2 1 4 3

2 1 3 5 6 4

3 5 4 2 1 6

4 2 6 3 5 1

请你写一个程序,产生按上述方法生成的拉丁方阵。

输入

第一行包含一个正整数N(大于1,但不大于100);

第二行为1~N的N个数。

输出

输出按照按上述方法生成的拉丁方阵(整数间用1个空格隔开)。

输入样例 1 

6
6 3 1 4 2 5

输出样例 1

6 3 1 4 2 5
1 4 5 6 3 2
5 6 2 1 4 3
2 1 3 5 6 4
3 5 4 2 1 6
4 2 6 3 5 1

#include <stdio.h>
int main(int argc,char const*argv[])
{
    int n , b[100] ,c[100]={0};
    int i , a[100][100];
    scanf("%d",&n);
    for(i = 0;i<n;i++)
    {
        scanf("%d",&b[i]);

    }

    int j=0,z,s1=0;
    for(z=0;z<n;z++)
    {   int k,s2=0,make,s3=0;
        for(s1=0;s1<n;s1++)
        {
            if(b[s1]==(z+1))
            {
                k=s1+1;
                for(s2=0;s2<n;s2++)
                {
                    if(b[s2]==k)
                    make=s2;

                }
                for(s2=make;s2<n;s2++)
                {
                    c[s3]=b[s2];
                    s3++;
                }
                 for(s2=0;s2<make;s2++)
                {
                    c[s3]=b[s2];
                    s3++;
                }
                for(s2=0;s2<n;s2++)
                {
                    a[s2][c[s2]-1]=z+1;

                }


            }
        }


    }
    for(i=0;i<n;i++)
    {  int s4=0;
        for(j=0;j<n;j++)
        { if(s4!=0)
        printf(" ");
            printf("%d",a[i][j]);
            s4++;
        }
        printf("\n");
    }

}
 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值