码迷,mamicode.com
首页 > 编程语言 > 详细

顺时针旋转填充 2维数组

时间:2016-09-20 00:15:22      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

今天面试碰到的题目,将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维数组

标签:

原文地址:http://www.cnblogs.com/dragonxyl/p/5887167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!