按上-右-下-左一圈再一圈的顺序给二维数组赋值,每次处理完一条边后要改变边界值的大小。最后打印
#include <stdio.h>
int main(){
    int n = 0, arr[20][20];
    scanf("%d\n", &n);
    int left = 0, right = n-1, up = 0, down = n-1;  //左右上下起始边界
    int i = 0, j = 0, val = 1;  //val是数值
    while(val <= n * n){
        for(i = left; i <= right; i++)  //最上面一行
            arr[up][i] = val++;   //列号向右逐渐增大
        up++;        //上边界向下加1
        for(i = up; i <= down; i++)  //最右边一列
            arr[i][right] = val++;  //行号逐渐向下增大
        right--;    //右边界向左减1 
        for(i = right; i >= left; i--)  //最下边一行
            arr[down][i] = val++;   //列号向左逐渐减少
        down--;    //下边界向上减1
        for(i = down; i >= up; i--)  //最左边一列
            arr[i][left] = val++;  //行号向上逐渐减小
        left++;    //左边界向右加1
    }
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++)
            printf("%d ", arr[i][j]);  //用萝卜填坑
        printf("\n");
    }
    return 0;
}