一、双螺旋矩阵
定义:双螺旋矩阵的定义如下,矩阵的最中心是1,往上是2,右拐3,向下4,然后依次5、6,7…构成一条顺序增大的螺旋线,此外,如果从中心往下走的话,也是一条对称的螺旋线。题目是给定一个矩阵维度N,将其打印出来,示例如下:
二、找规律
从图1可以看出,沿着螺旋线,数值是递减的
从图2可以看出,矩阵可以分为上半圈和下半圈,而且是中心对称的,因此只要计算下半圈的数值就可以知道下半圈,细心的可以发现,每一圈的边长都是奇数,也就是1,3,5,7…,第一个数等于(n*n+1)/2,所以只要从外到内,一圈一圈开始读入数据就可以,每一圈的开始位置都是沿着图2的虚线开始的,也就是(0,0)、(1,1)和(2,2)这样的位置。
三、代码实现
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
vector<vector<int>> data(n, vector<int>(n));
int i = 0, j = 0;
int start = 0;
int end = n - 1;
int num = (n*n + 1) / 2;//初始位置(0,0)的数
int side = n - 1;
while (1)
{
while (i <= end && num >= 1)
{
data[i][j] = num--;
data[side - i][side - j] = data[i][j];//根据中心对称求另外一个位置的数
i++;
}
i--;
j++;
while (j <= end - 1 && num >= 1)
{
data[i][j] = num--;
data[side - i][side - j] = data[i][j];
j++;
}
if (num == 0)
break;
start++;
i = start;
j = start;
end--;
}
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{
cout << data[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
return 0;
}