C/C++ 方形盘龙(关于数组的问题)

题目都看不懂,有人帮忙看看吗?
题目描述:生活中,逢年过节舞龙灯的传统,长长的龙身,可以一字展开,也可以盘曲起来。现在请你编程模拟盘龙的形状。为了简化,此处的盘龙形状不是圆形,而是方形。
模拟展示一个形如盘龙的数组呢?龙头在左上角,按顺时针方向由外向内盘踞。
输入:第一行为一个整数,表示测试用例的个数。其后的每一行,有个整数n(1 < = n < = 30 )。
输出:对每个n×n正方形数组,请参照输出样例,输出盘龙状数组。为了对齐,每个数组元素占4个字符宽度,并且,不足4个字符的按向右对齐输出。每个测试用例的输出之后有一个空行。

注意每行末尾没有空格。
样例输入:
3
1
2
5
样例输出:
1

1 2
4 3

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
int a[20][20];
int main() {
    int t,n,k,direct;
    cin>>t;
    for(int c=0; c<t; c++) {
        direct=4;
        cin>>n;
        int i=0,j=0;
        k=1;
        memset(a,0,sizeof(a));
        while(k<=n*n) {
            if(a[i][j]==0) {
                a[i][j]=k;
                k++;
            }
            if(direct == 1) { //向上
                i--;//行减1
                if(i==-1||a[i][j]!=0) {
                    direct=4;
                    i++;
                    j++;
                }
            } else if(direct == 2) {
                i++;
                if(i==n||a[i][j]!=0) {
                    direct=3;
                    i--;
                    j--;
                }
            } else if(direct == 3) {
                j--;
                if(j==-1||a[i][j]!=0) {
                    direct=1;
                    i--;
                    j++;
                }
            } else if(direct == 4) { 
                j++;
                if(j==n||a[i][j]!=0) {
                    direct=2;
                    i++;
                    j--;
                }
            }
        }
        for(i=0; i<n; i++) {
            for(j=0; j<n; j++) {
                cout<<setw(4)<<a[i][j] <<" ";
            }
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}