• 蛇形方阵


    按照对角线填数。

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

    1>

    • 斜上方走:x--,y++
      只要x>=1 && y<=n 就能往上走
      如果 x==1 继续往上走就会出界,普通的出界只需要往下一行,特殊的出界就是走到右上角(0,4),这时候要往下两行,后退一列
    • 斜下方走:x++,y--
      普通的出界就是(3,0),使列加一,特殊的出界就是左下角(5,0),列+2,往上一行
    int main(int argc, const char * argv[]) {
        int n;
        scanf("%d", &n);
        int x,y,tot;
        a[x=1][y=1] = tot = 1;
        while (tot <= n*n) {
            while (x >= 1 && y <= n) {
                a[x--][y++] = tot++;
            }
            if (y == n+1) {
                x +=2; y--;
            } else {
                x++;
            }
            while (x <= n && y >= 1) {
                a[x++][y--] = tot++;
            }
            if (x == n+1) {
                y += 2; x--;
            } else {
                y++;
            }
        }
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j)
                printf("%5d", a[i][j]);
            puts("");
        }
        
        return 0;
    }
    

    2>

    • (total > n^2) 时,一定要跳出循环,不然会一直换方向
    • 走到边缘可能需要多次转向,P1 只需要转一次
      P2 右上不能走,就会往右走,也不行就往左下找,左下已经填过了,最后会往下走
    • 走完一步之后要判断,如果这时候的方向是右或下,就要改变方向,右走和下走只需要走一步,不然会填满一整行或一整列
    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 (tot > n*n) break;
            // 循环, 边缘需要多次转向
            while (a[x+dx[k]][y+dy[k]] != 0) {
                k++;
                k %= 4;
            }
            x = x+dx[k];
            y = y+dy[k];
            //**右 || 下  只走一次,走完转向
            if (k==0 || k==2) k++;
        }
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j)
                printf("%5d", a[i][j]);
            puts("");
        }
        
        return 0;
    }
    
  • 相关阅读:
    10年学到的编程经验总结
    测试框架 Mocha 实例教程
    在 Flutter 中玩转 Objective-C Block
    使用Gulp压缩混淆JS的相关配置
    Gulp前端自动化构建工具
    常用的十大 NodeJS 框架
    如何使用Vue中的嵌套插槽(包括作用域插槽)
    通过Python代码操作MySQL:
    使用python发邮件:
    jquery:
  • 原文地址:https://www.cnblogs.com/i-8023-/p/12634602.html
Copyright © 2020-2023  润新知