顺时针旋转填充 2维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺时针旋转填充 2维数组相关的知识,希望对你有一定的参考价值。

今天面试碰到的题目,将1开始的自然数按照顺时针顺序填充到二维数组中,要求输入矩阵的 高度M 和 长度N, 输出填充后的矩阵, 效果如下图的效果所示:

 技术分享

 

当时头脑有点发懵,想了半天边界条件没写好,回去路上思考了一下,解决这个问题可以分两步考虑:

1, 给一个mXn的矩阵,和矩阵的开始坐标 x,y,顺序填充该矩阵的最外围边缘

2,不断缩小矩阵的规模(每次高度和长度各减少2),直到m和n有一个为0,则说明该填充结束。同时需要注意如果是奇数行,如果有一边先变成1,则此时需要单独处理,填充一个横向或纵向的1维数组,同样结束填充。

下面贴上代码:

#include <vector>
#include <stdio.h>
using namespace std;

#define X 100
 
int A[X][X];

void FilltheEdge(int x, int y, int m, int n, int &cnt)
{
    int i = x, j =y;
    while(j<y+n-1)
        A[i][j++] = cnt++;

    while(i<x+m-1)
        A[i++][j] = cnt++;

    while(j>y)
        A[i][j--] = cnt++;

    while(i>x)
        A[i--][j] = cnt++;
}

int main()
{
    int M,N;
    while(scanf("%d%d", &M, &N)!=EOF)
    {
        int m = M, n = N;
        int x = 0, y =0;
        int cnt = 1;

        while(m>0&&n>0)
        {
            if(m == 1)
            {
                for(int k = y; k<y+n;++k)
                    A[x][k] = cnt++;
                break;
            }
            else if(n == 1)
            {
                for(int k = x; k<x+m;++k)
                    A[k][y] = cnt++;
                break;
            }
            else
            {
                FilltheEdge(x, y ,m, n, cnt);
                x++;
                y++;
                m-=2;
                n-=2;
            }
        }

        for(int i=0;i<M;i++)
        {
            for(int j = 0; j<N;j++)
                printf("%3d  ", A[i][j]);
            printf("\n");
        }
    }

    return 0;
}

 

以上是关于顺时针旋转填充 2维数组的主要内容,如果未能解决你的问题,请参考以下文章

二维数组顺时针旋转90度

顺时针旋转二维数组

数组:顺时针打印矩阵

单击div,使其顺时针旋转180°

剑指Offer 29 - 顺时针打印矩阵

Python学习笔记 之 递归二维数组顺时针旋转90°正则表达式