拉丁方阵
描述
一个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");
}
}