思路
我们先按着右,下,左,上 的方向依次填数将数组元素写好后再进行输出;
填数的时候遵循先判断下一位置是否合法(即是否越界或者已经填过了),如果合法就填数,如果不合法意味着应该换方向;
判断是否越界:是否超过n,m 的限制;
判断是否填过:初始化全为零,如果不为零,意味着当前位置已经填过;
时间复杂度
O(n * m):只需要遍历一遍所有元素即可;
C++ 代码
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 100;
int a[maxn][maxn];
int main(){
memset(a, 0, sizeof(a));
int n, m, num = 0;
scanf("%d%d", &n, &m);
int x = 0, y = 0;
a[x][y] = 1;
num++;
while(num < n*m){
while(y + 1 < m && !a[x][y + 1]) a[x][++y] = ++num;
while(x + 1 < n && !a[x + 1][y]) a[++x][y] = ++num;
while(y - 1 >= 0 && !a[x][y - 1]) a[x][--y] = ++num;
while(x - 1 >= 0 && !a[x - 1][y]) a[--x][y] = ++num;
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
if(j != 0) printf(" ");
printf("%d", a[i][j]);
}
printf("\n");
}
return 0;
}