【NYOJ】[33]蛇形填数_i++

刚开始看感觉很有意思
猛一看感觉挺简单
想想有点难
再仔细想想其实还好

我是用的边界加是否填过判定的
然后用了个 flag 标记当前的填充方式

#include<stdio.h>
#include<string.h>
int main() {
    int n;
    int map[120][120];
    while(scanf("%d",&n)!=EOF) {
        memset(map,0,sizeof(map));
        int y=1,x=n,cnt=0;
        int flag=1;
        while(cnt<n*n) {
            map[y][x]=++cnt;
            if(flag==1)
                y++;
            else if(flag==2)
                x--;
            else if(flag==3)
                y--;
            else if(flag==4)
                x++;
            if(map[y][x]||x<1||x>n||y<1||y>n) {
                if(flag==1) {
                    y--;
                    x--;
                    flag=2;
                } else if(flag==2) {
                    x++;
                    y--;
                    flag=3;
                } else if(flag==3) {
                    y++;
                    x++;
                    flag=4;
                } else if(flag==4) {
                    x--;
                    y++;
                    flag=1;
                }
            }
        }
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n; j++) {
                printf("%d",map[i][j]);
                if(j!=n)
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

标程思路是循环几圈
然后通过数学关系直接按照
下左上右的循环输出
也是非常巧妙

#include<stdio.h>
int main() {
    int a,b,c,d,n,sum=1;
    int yi[101][101];
    scanf("%d",&n);
    for(a=0; a<=(n-1)/2; a++) {
        for(b=a; b<=n-a-1; b++)
            yi[b][n-a-1]=sum++;
        for(b=n-2-a; b>=a; b--)
            yi[n-a-1][b]=sum++;
        for(b=n-a-2; b>=a; b--)
            yi[b][a]=sum++;
        for(b=a+1; b<n-a-1; b++)
            yi[a][b]=sum++;
    }
    for(c=0; c<n; c++) {
        for(d=0; d<n; d++)
            printf("%d ",yi[c][d]);
        printf("\n");
    }
}

题目地址:【NYOJ】[33]蛇形填数