首页 > 解决方案 > C 中的谢尔宾斯基地毯

问题描述

我正在建立一个谢尔宾斯基地毯代码。输入 (n) 表示输出是 3^1*3^1 的瓦片块。黑色部分用“#”表示,白色部分用“.”表示。现在我被这段代码困住了。

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

void center(int c, int g, int i, int j, char** a);

int main(void)
{
    int c, g, i=0, j=0;
    double n, b;
    scanf("%lf", &n);
    g=n-1;
    b=pow(3, n);
    c=b;

    char **a=(char **)malloc(c * sizeof(int *));
    for (i = 0; i < c; i++) {
        a[i] = (char *)malloc(c * sizeof(int));
    }
    if (n==1.0){
        for (int e=0; e<3; e++){
            for (int f=0; f<3; f++){
                if (e==1 && f==1){
                    a[e][f]='#';
                }
                else{
                    a[e][f]='.';
                }
                printf("%c", a[e][f]);
            }
            printf("\n");
        }
    }
    else{
        center(c, g, i, j, a);
        n=n-1.0;
        c=c/3;
        g--;
        while (n>0){
            int d=0;
            while (d<8){
                center(c, g, i, j, a);
                i=i+9;
                j=j+9;
            }
            c=c/3;
            g--;
            d=d*8;
            n=n-1.0;
        }
        for (int e=0; e<c; e++){
            for (int f=0; f<c; f++){
                if (a[e][f]!='#'){
                    a[e][f]='.';
                }
                printf("%c", a[e][f]);
            }
            printf("\n");
        }
    }
    return 0;
}

void center(int c, int g, int i, int j, char** a){
    for (i=((c/2+1)-(3*g-2)-1); i<((c/2+1)+(3*g-2)-1); i++){
        for (j=((c/2+1)-(3*g-2)-1); j<((c/2+1)+(3*g-2)-1); j++){
            if (a[i][j]!='#'){
                a[i][j]='#';
            }
        }
        printf("\n");
    }
}

我的计划是创建功能“中心”来创建所有黑色区域。我使用指针指向数组,以便在使用 center() 打印所有黑色空格时复制数组的值。任何帮助将不胜感激。

标签: c

解决方案


推荐阅读