首页 > 解决方案 > 任何人都可以建议我为这种模式提供更好/更短的方法吗?

问题描述

4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4

对于这种模式,我想要一个更短的代码或更智能的代码。我的代码工作正常,但有点长。

我的代码

#include <stdio.h>
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=n;i>=1;i--)
    {
        for(j=n;j>i;j--)
        {
            printf("%d ",j);
        }
        for(j=1;j<(2*i)-1;j++)
        {
            printf("%d ",i);
        }
        for(j=i;j<=n;j++)
        {
            printf("%d ",j);
        }
        printf("\n");
    }
    for(i=2;i<=n;i++)
    {
        for(j=n;j>i;j--)
        {
            printf("%d ",j);
        }
        for(j=1;j<(2*i)-1;j++)
        {
            printf("%d ",i);
        }
        for(j=i;j<=n;j++)
        {
            printf("%d ",j);
        }
        printf("\n");
    }

    return 0;
}

标签: cloopsfor-looppattern-matchingconditional-statements

解决方案


像这样怎么样:

#include <stdio.h>
#include <stdlib.h>

int max (int a, int b) {
    return a > b ? a : b;
}

void pattern (int width) {
    int count = width;
    int digits = 1;
    while (count /= 10)
        ++digits;

    for (int line = 0; line < (2*width-1); ++line) {
        for (int col = 0; col < (2*width-1); ++col) {
            int val = max (abs (1+line-width)+1, abs (1+col-width)+1);
            if (col > 0)
                putc (' ', stdout);
            printf ("%*d", digits, val);
        }
        puts ("");
    }
}

int main (int argc, char* argv []) {
    int width = argc > 1 ? atoi (argv [1]) : 4;
    pattern (width);
}

这个想法是遍历所有位置,计算到 X 和 Y 方向中间位置的距离,并取其中的最大值。


推荐阅读