其他分享
首页 > 其他分享> > 螺旋方阵

螺旋方阵

作者:互联网

从某个角开始,按照顺时针或者逆时针填数。

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

第一种方法

如果x,y没超出边界和下一个位置未访问,那就可以一直填数,否则就换个方向。

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d", &n);
    int x = 1, y = 1, tot = 1;
    a[x][y] = 1;
    while (tot < n*n) {
        while (y+1 <= n && a[x][y+1] == 0) a[x][++y] = ++tot;
        while (x+1 <= n && a[x+1][y] == 0) a[++x][y] = ++tot;
        while (y-1 >= 1 && a[x][y-1] == 0) a[x][--y] = ++tot;
        while (x-1 >= 1 && a[x-1][y] == 0) a[--x][y] = ++tot;
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j)
            printf("%5d", a[i][j]);
        puts("");
    }
        
    return 0;
}

第二种方法

a[x][y]开始填数,只要下一个位置的值为 0 就可以填数;
不为 0,可能已经填数或者到边界,那就需要换方向,如果 k==4,那方向就要重置;

const int MAXN = 22;
int a[MAXN][MAXN];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d", &n);
    memset(a, -1, sizeof a);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            a[i][j] = 0;
    int x,y,tot, k = 0;
    x = y = tot = 1;
    while (tot <= n*n) {
        a[x][y] = tot++;
        if (a[x + dx[k]][y + dy[k]] != 0) {
            k++;
            k %= 4;
        }
        x = x + dx[k];
        y = y + dy[k];
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j)
            printf("%5d", a[i][j]);
        puts("");
    }

    return 0;
}

标签:const,螺旋,int,tot,while,填数,MAXN,方阵
来源: https://www.cnblogs.com/i-8023-/p/12633251.html