342
社区成员
发帖
与我相关
我的任务
分享初始化一个n * n的二维数组,用0填充所有位置
定义四个变量,a、b、c和d,分别表示当前层的左、右、上、下四个边界位置。初始时、a、c均为0,b为n-1,d为n-1
定义一个计数器num,从1开始依次填充数组元素。依次按照从左到右、从上到下、从右到左、从下到上的顺序,填充当前层剩余的元素,直到所有元素都被填充完毕。
如果向右填充,应该在第c行从a到b填充;如果向下填充,应该在第b列从c+1到d填充;如果向左填充,应该在第d行从b-1到a填充;如果向上填充,应该在第a列从d-1到c+1填充。
当前层的元素填充完毕后,更新左、右、上、下四个边界位置,并进入下一层,重复上述步骤填充下一层。直到所有层都被填充完毕为止。
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int arr[20][20] = { 0 };
int a = 0, b = n - 1, c = 0, d = n - 1;
int num = 1;
while (a <= b && c <= d) {
// 向右填充
for (int i = a; i <= b; ++i) {
arr[c][i] = num++;
}
++c;
// 向下填充
for (int i =c; i <= d; ++i) {
arr[i][b] = num++;
}
--b;
// 向左填充
if (a<= b) {
for (int i = b; i >= a; --i) {
arr[d][i] = num++;
}
--d;
}
// 向上填充
if (c <= d) {
for (int i = d; i >= c; --i) {
arr[i][a] = num++;
}
++a;
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}