顺时针旋转填充 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维数组的主要内容,如果未能解决你的问题,请参考以下文章