首页 > 代码库 > 顺时针旋转填充 2维数组

顺时针旋转填充 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维数组