#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    int a[n][n];
    int flag = 1;
    int x = 0;
    int y = 0;
    int b = 0;
    int c = n;
    for(int i = 0;i<n*n;i++){
        if(flag == 1){
            a[x][y] = i+1;
            y++;
        }
        else if(flag == 2){
            a[x][y] = i+1;
            x++;
        }
        else if(flag == 3){
            a[x][y] = i+1;
            y--;
        }
        else{
            a[x][y] = i+1;
            x--;
        }
        if(y == c-1 && x == b){
            flag = 2;
        }
        else if(y == c-1 && x == c-1){
            flag = 3;
        }
        else if(y == b && x == c-1){
            flag = 4;
            b++;
            c--;
        }
        else if(x == b && y == b-1){
            flag = 1;
        }
    }
    for(int i = 0;i<n;i++){
        for(int j = 0;j<n;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
这道题个人觉得好难。但是通过率竟然快60,可是解答思路和讨论却很少。估计写到这里的都是大佬吧。我一开始想的时候是有想到利用边缘值进行转向的,但是没有想到好的办法。看了下其他人的解题思路。现总结如下。分别对向下向上向左向右做四个标志值,根据行号和列号确定碰边了没有,碰边便转变标志值。当完成一次循环后,需要把行边界值加1,列边界值减1;然后从flag4 转到flag1 ,即从向上转到向左就是利用了行号加1后,减掉1等于左边界的列号