时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 Description
小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
输入描述 Input Description
n(即n行n列)
输出描述 Output Description
n+1行,n行为组成的矩阵,最后一行为对角线数字之和
样例输入 Sample Input
3
样例输出 Sample Output
5 4 3 6 1 2 7 8 9 25
数据范围及提示 Data Size & Hint
分类标签 Tags
思路:和原来的一样由外向里填数,因为n是奇数,所以从右下角开始,(偶数从左上角开始),
代码:
#include
#include
#include
using namespace std;
#define maxn 101
int a[maxn][maxn],tot=0,n,x,y;
long long sum=0;
void ts();
void sc();
int main()
{
scanf("%d",&n);
tot=n*n;
x=n;y=n;
a[n][n]=tot;//从nn开始是因为输入一定是奇数
ts();
sc();
return 0;
}
void sc()
{
for(int i=1,j=1;i<=n&&j<=n;++i,++j)
sum+=a[i][j];
for(int i=1,j=n;i<=n&&j>=1;++i,--j)
sum+=a[i][j];
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
printf("%-5d",a[j][i]);//五位向左对齐 ,注意输出是a[i][j]还是a[j][i]
printf("\n");
}
printf("%d\n",sum-1);//中间相交的那个一,不重复加
}
void ts()
{
while(tot>1)
{
while(x-1>=1&&a[x-1][y]==0) a[--x][y]=--tot;//从总数开始向里面移动
while(y-1>=1&&!a[x][y-1]) a[x][--y]=--tot;//顺序是左,上,右,下的顺序
while(x+1<=n&&!a[x+1][y]) a[++x][y]=--tot;
while(y+1<=n&&!a[x][y+1]) a[x][++y]=--tot;
}
}
n> 所在的高度储存下来if(a[i][2]!=0)
h[a[i][2]]=h[i]+1;
}
for(int i=1;i<=n;++i)
w[h[i]]++;//把每个高度的宽储存下来
sort(h+1,h+n+1,cmp);//取宽度和高度最大的输出
sort(w+1,w+n+1,cmp);
printf("%d %d",w[1],h[1]);
return 0;
}