• 螺旋方阵


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

    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;
    }
    
  • 相关阅读:
    leetCode 78.Subsets (子集) 解题思路和方法
    大话设计模式C++版——代理模式
    不用加减乘除做加法
    hdu 1257
    小学生算术
    字符串排序问题
    POJ 2421 Constructing Roads
    http://vdceye.com/ 全新页面上线
    POJ3262 Protecting the Flowers 【贪心】
    集群环境下JSP中获取客户端IP地址的方法
  • 原文地址:https://www.cnblogs.com/i-8023-/p/12633251.html
Copyright © 2020-2023  润新知