腾讯笔试题:蛇形矩阵

题目: 蛇形矩阵,是由1开始的自然数一次排列成的N*N的正方形矩阵,数字依次由外而内的递增,如下面实例:
N=3时:
1 2 3
8 9 4
7 6 5
N=6时:
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
要求:输入蛇形矩阵宽度,输出蛇形矩阵结果。

将矩阵像剥洋葱一样,层层剥离,每一次循环为矩阵的这一层赋值,若矩阵宽度为偶数,则矩阵无心,若宽度为奇数,则矩阵有心(单独的一个数),对于这种情况需要单独处理。

#include<iostream>
using namespace std;

void print(int n)
{
    int **matrix = new int*[n];//建立二维数组
    for (int k = 0; k < n; k++)
    {
        matrix[k] = new int[n];
    }
    int circle = 0;//循环次数
    int v = 1;//矩阵初值
    int i = 0, j = 0;
    while (n-2*circle>=2)//以n-2*circle作为mark,若矩阵宽度为偶数,mark取到2时,矩阵赋值结束;若矩阵宽度为奇数,mark会取到1,此时需要单独处理。
    {
        for (j=circle; j < n-circle; j++)
        {
            matrix[i][j] = v;
            v++;
        }
        j--;
        i++;
        for (i; i < n-circle; i++)
        {
            matrix[i][j] = v;
            v++;
        }
        i--;
        j--;
        for (j; j >= circle; j--)
        {
            matrix[i][j] = v;
            v++;
        }
        j++;
        i--;
        for (i; i > circle; i--)
        {
            matrix[i][j] = v;
            v++;
        }
        i++;
        circle++;
    }
    if (n-2*circle == 1)
    {
        j = circle;
        matrix[i][j] = v;
    }
    for (i = 0; i < n; i++)//输出矩阵
    {
        for (j = 0; j < n; j++)
        {
            cout << matrix[i][j]<<" ";
        }
        cout << endl;
    }
}
int main( )
{
    int N;
    cin >> N;
    print(N);
    return 0;
}

如下为运行结果:
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章