XP迎来了他大学第一堂期末考试,老师开始安排考场座次,第一列从第一个同学开始从前往后按照学号(学号从1开始递增)升序排列,然后第二列接着第一列最后一个同学的学号从后往前按照学号升序排列,第三列又从第一个同学开始接着第二列的第一个同学的学号从前往后按照学号升序排列,......,依次类推。为了简化问题,我们假设考场有n行n列,你能够帮XP编写一个程序生成考场座次表吗?
输入
单组输入数据
n(n<=20)
输出
一个n行n列的座次表,注意每列的学号要向右对齐,且行末不要有多余的空格
样例输入
4
样例输出
1 8 9 16 2 7 10 15 3 6 11 14 4 5 12 13
//实不相瞒,这个题我几乎写了两个小时,格式一值达不到题目的要求
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int a[n][n];
int i,j;
int ans=1;
int m,max1[20];
m=-1;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[j][i]=ans;
if(m<a[j][i])
m=a[j][i];
ans++;
}
max1[i]=m;
}
int t;
for(i=1;i<n;i+=2)
{
for(j=0;j<n/2;j++)
{
t=a[j][i];
a[j][i]=a[n-j-1][i];
a[n-j-1][i]=t;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
m=max1[j]/10;
if(m>=1000)
printf("%6d",a[i][j]);
else if(m>=100)
printf("%5d",a[i][j]);
else if(m>=10)
printf("%4d",a[i][j]);
else if(m>=1)
{
if(j!=0)
printf("%3d",a[i][j]);
else
printf("%2d",a[i][j]);
}
else if(m==0)
{
if(j!=0)
printf("%2d",a[i][j]);
if(j==0)
printf("%d",a[i][j]);
}
}
if(i!=n-1)
cout<<endl;
}
return 0;
}