如何输出这样的矩阵呢?

描述

 

   01 故事起源有这样的一种矩阵,从左上角开始,顺时针从外向里旋转,数字依次递增,如果给定任意行n、列m,请问如何输出这样的矩阵呢?  模拟    02 分析这个问题第一眼就觉得很简单,为啥呢,因为规律很明显,问题描述都已经说的很清晰了,只要按照要求模拟一遍就行了。
如果现在让你把这个问题描述给其他人,你是不是也会这样来描述:一直向前走,无路可走向右转。。。  模拟    03 模拟啥是模拟呢,模拟就是按照你的想法,机械的执行命令就可以了,没有啥算法可言,就像这个问题一样。  模拟  不过机器并不能听懂你的高级语言,所以需要翻译一下。  模拟  说机话
整个过程拆解为4个步骤:
从矩阵左上角开始向右直到边界;2)向下;3)向左;4)向上。
重复上面4个步骤,直到填满整个矩阵。
 模拟  于是我们就得到了初步的框架:

			while (还没填满) {   // 向右直到边界     j++;   // 向下直到边界     i++;   // 向左直到边界     j--;   // 向上直到边界   i--; }
			 
									 04
									细节从左向右,结束时j超出边界,需要j--。最上一行已填满,上边界下移,同时i也下移。
			 模拟
			 从上向下,结束时i超出边界,需要i--。最右一列已填满,右边界左移,同时j也左移。
			 模拟
			 其余2个过程同理。
			 
										 05
										代码实现
#define ROW 5
#define COLUMN 5
void main() {
    int left = 0, right = COLUMN - 1, top = 0, bottom = ROW - 1;
    int f[ROW][COLUMN], i = 0, j = 0, num = 1;
    while (i >= top && i <= bottom && j >= left && j <= right) {
        // left->right
        while (j <= right) {
            f[i][j++] = num++;
        }
        j--;
        top++;
        i++;
        // top->bottom
        while (i <= bottom) {
            f[i++][j] = num++;
        }
        i--;
        right--;
        j--;
        // right->left
        while (j >= left) {
            f[i][j--] = num++;
        }
        j++;
        bottom--;
        i--;
        // bottom->top
        while (i >= top) {
            f[i--][j] = num++;
        }
        i++;
        left++;
        j++;
    }
}
   06 总结模拟问题一般都比较简单,只需要把整个框架过程抽象出来,然后机械的实现即可。但偶尔也会遇到复杂的模拟,一般都是细节涉及的比较多,比如边界信息太多,或者过程太多等。不过这种问题很适合锻炼代码实现能力,多做就能达到“有思想就一定能实现”的状态。   审核编辑 :李倩

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分