您的位置:首页 > 编程语言

GEEK编程练习— —螺旋矩阵

2016-04-04 10:43 225 查看
今天开始,尽量每天一道实战编程题,不管题目新旧,总是可以考察你的编程基本功和思维。

题目

今天的题目是一道螺旋矩阵的题目,有的人也称回型矩阵、蛇形矩阵等,但其实都蛇形矩阵还有别的样式,请自行度娘~题目内容为输入一个正整数n,输出一个如下的螺旋矩阵

n=1的螺旋矩阵

1

n=2的螺旋矩阵

1 2

4 3

n=3的螺旋矩阵

1 2 3

8 9 4

7 6 5

n=4的螺旋矩阵

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

分析

可以看出一种规律,拿n=4当栗子,最外面一层,先从左向右1、2、3,然后从上到下4、5、6,再从右向左7、8、9,最后是从下往上10、11、12,接着按照这个规律进行内层循环。那么就可以把每层按照方向分成4组,每组分别进行赋值。特别是当n为奇数时,最内层是一个值,可以进行赋值。具体代码如下:

代码

//Helix Matrix
//Date : 2016-04-03
//Author :Sin_Geek

#include <iostream>
#include <vector>

using namespace std;

int main()
{
int n;
cin >> n; //输入矩阵的规模

//生产n*n矩阵
vector<vector<int>> a(n, vector<int>(n));

//l用来递增赋值,k表示从外往内数第几层
int k,l = 0;

//对于n为奇数的矩阵,首先对中心元素赋值
if (n%2)
a[n/2][n/2] = n*n;

//按照分组所需要的循环次数
for (int i = 0; i < n * 2 - n % 2; ++i)
{
k = i/4;
//分组内需要的循环次数
for(int j = 0; j < n - 2 * k -1; ++j)
{
++l;
switch(i%4)
{
case 0://上层
a[k][j + k] = l;
break;
case 1://右层
a[j + k][n - 1 - k] = l;
break;
case 2://下层
a[n - 1 - k][n - 1 - j - k] = l;
break;
case 3://左层
a[n - 1 - j - k][k] = l;
break;
}
}
}

//按照矩阵形式输出
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cout << a[i][j] << ends;
}
cout << endl;
}

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