您的位置:首页 > 其它

17.蛇形矩阵(模拟)

2016-02-28 08:47 323 查看
时间限制: 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

=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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: