01 故事起源有这样的一种矩阵,从左上角开始,顺时针从外向里旋转,数字依次递增,如果给定任意行n、列m,请问如何输出这样的矩阵呢? 02 分析这个问题第一眼就觉得很简单,为啥呢,因为规律很明显,问题描述都已经说的很清晰了,只要按照要求模拟一遍就行了。
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
总结模拟问题一般都比较简单,只需要把整个框架过程抽象出来,然后机械的实现即可。但偶尔也会遇到复杂的模拟,一般都是细节涉及的比较多,比如边界信息太多,或者过程太多等。不过这种问题很适合锻炼代码实现能力,多做就能达到“有思想就一定能实现”的状态。
审核编辑 :李倩全部0条评论
快来发表一下你的评论吧 !