找规律模拟蛇形矩阵构造的方法
以输入7为例
0 1 2 3 4 5 6
中心位置的坐标直接为 n/2取整即可得到
然后从中位置开始按照逆时针的方向赋值
水平方向是y
竖直方向是x
则有第一次 是在起始坐标的基础上做变换
1、y++ , x--;
2、y--,y--, x++,x++;
3、y++,y++y++, x--,x--,x--;
...
然后模拟这个过程就可以了
最后求得数组变输出边求对角线的和
对角线上的元素有两种情况
1、 i == j;
2、i + j = n-1;
对应相加即可
另外这里用动态申请了一个二维数组
不是用之前重载一个类的形式
直接用**指针更加方便些
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int n,x,y;
int count = 1;
int ** num;
bool flag = true;
cin>>n;
num = new int*[n];
for(int i = 0; i < n; i++)
num[i] = new int[n];
x = y = n / 2;
num[x][y] = 1;
for(int i = 1;;)
{
if(flag)
{
for(int j = 0; j < count; j++)
{
i++;
if(i > n*n)break;
y++;
num[x][y] = i;
}
if(i > n*n)break;
for(int j = 0; j < count; j++)
{
i++;
if(i > n*n)break;
x--;
num[x][y] = i;
}
if(i > n*n)break;
flag = !flag;
count++;
}
else
{
for(int j = 0; j < count; j++)
{
i++;
if(i > n*n)break;
y--;
num[x][y] = i;
}
if(i > n*n)break;
for(int j = 0; j < count; j++)
{
i++;
if(i > n*n)break;
x++;
num[x][y] = i;
}
if(i > n*n)break;
flag = !flag;
count++;
}
}
int sum = 0;
for(int i = 0; i < n ; i++)
{
for(int j =0 ; j < n; j++)
{
cout<<num[i][j]<<" ";
//cout<<setw(3)<<num[i][j];
if(i == j || i +j == n -1)sum += num[i][j];
}
cout<<endl;
}
cout<<sum;
for(int i = 0; i < n ; i++)
delete [] num[i];
delete[] num;
return 0;
}
总耗时 | 内存占用 | 语言 | 代码 |
---|
6ms | 1672kb | C++ | 1718B |
当然也可以从外向内填数来模拟。。。