版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xckkcxxck/article/details/83046222
1160 蛇形矩阵 http://codevs.cn/problem/1160/
时间限制: 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
解答:这个题是一个模拟题,我的解法就是从数组中心开始模拟,按照,右,上,左,下的顺序,走完一次算一轮。每次方向区分使用flag标记。关于每次走多少步,这里我通过找规律发现的,应该是第一轮:右1,上1,左2,下2,。第二轮:右3,上3,左4,下4,可以看到右和上步数和论数k的关系是2*k-1=步数,左和下则是2*k=步数。因为conut是从0开始计数的,就写成了代码中的判断。最后再补足数组的最后一行即可。关于对角线和只需要找出规律进行相加就可以了。
PS:这个题我几度想放弃,可是看了看后面的题解,我感觉还是自己写吧,题解没有写得很详细的,而且其实看别人的答案就感觉自己已经输了的感觉。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[100][100]={0};
int i=n/2,j=n/2, k,x=1;
int m=1;
int count=0;
int flag=0;
a[i][j]=m;
m++;
for(k=1;k<=n/2;k++ )
{
if(flag%4==0)
{
count=0;
while(count<2*k-1)
{
j++;
a[i][j]=m;
m++;
count++;
}
flag++;
}
if(flag%4==1)
{
count=0;
while(count<2*k-1)
{
i--;
a[i][j]=m;
m++;
count++;
}
flag++;
}
if(flag%4==2)
{
count=0;
while(count<=2*k-1)
{
j--;
a[i][j]=m;
m++;
count++;
}
flag++;
}
if(flag%4==3)
{
count=0;
while(count<=2*k-1)
{
i++;
a[i][j]=m;
m++;
count++;
}
flag++;
}
}
int c = n*n-n+2;
for(int i=n-1,j=1; j<n; j++)
{
a[i][j]= c;
c++;
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
int sum =0;
for(i=0; i<n; i++)
{
sum = sum + a[i][n-i]+a[i][i];
}
sum =sum-a[i][i];
cout<<sum<<endl;
return 0;
}