`` 没有Ocean 写的好 思路还是去Ocean的那边看比较好 我的思路基本都在注释上了 看不懂java的代码可以看看纯C写的 //从早上写到了晚上 不写个题解浑身难受

#include<stdio.h>//关键::图形需要 从下至上 从后往前 从下到上  覆盖 不然可能会出现覆盖不完全的情况 
#include<string.h>
int main()
{
    char a[1001][300]={{"\0"}};//用来存储最终模型
    int i=0,t=0,m,n,v=0,u,x,y,z=0,cnt=0,maxh=0;
    int s[250000]={0};//用于存放每个单位最左下角的坐标(起始坐标)(由这个坐标构造单位方块),每两个数字代表一个坐标
    scanf("%d%d",&m,&n);
    for(i=m-1;i>=0;i--)//从第一行开始
    {
        for(t=0;t<n;t++)//第一列开始
        {
            x =1000-2*i;//x 表示行 y表示列
            y =2*i+4*t;//数格子 前后摆放 行数差为2 列数差为2、左右摆放 行数差为0 列数差为4  
            scanf("%d",&u);//获取每个格子上叠放多少个方块
            for(v=0;v<u;v++)//获取此个格子从下到上的起始坐标
            {   
                s[z]=x;
                z++;//z只是用来计数的
                s[z]=y;
                z++;
                x-=3;//上下摆放 行数差为3 列数差为0
                cnt ++;//用作下面循环次数
            }//此时获取的坐标 就是从左上角开始 从下到上 再从左到右 最后从前到后
        };
    };
   for(i=0;i<cnt*2;i+=2)//进行模型建立(和坐标顺序一样)(每次i+2 cnt也要*2 要循环cnt次) 
    {
        x=s[i];
        y=s[i+1];
        if(1000-x+5>maxh)maxh =1000-x+5;//获得最大高度的行数
        //字符串没学好 比较菜 不懂怎么给二维数组输入字符串 只能一个一个字符打了
/*      ..+---+
        ./   /| 这是最小模型
        +---+ | 其中点(‘.’)不在此循环输出 
        |   | +
        |   |/.
        +---+..     */
       a[x][y]='+';
       a[x][y+1]='-';
       a[x][y+2]='-';
       a[x][y+3]='-';
       a[x][y+4]='+';
       a[x-1][y]='|';
       a[x-1][y+1]=' ';
       a[x-1][y+2]=' ';
       a[x-1][y+3]=' ';
       a[x-1][y+4]='|';
       a[x-1][y+5]='/';
       a[x-2][y]='|';
       a[x-2][y+1]=' ';
       a[x-2][y+2]=' ';
       a[x-2][y+3]=' ';
       a[x-2][y+4]='|';
       a[x-2][y+5]=' ';
       a[x-2][y+6]='+';
       a[x-3][y]='+';
       a[x-3][y+1]='-';
       a[x-3][y+2]='-';
       a[x-3][y+3]='-';
       a[x-3][y+4]='+';
       a[x-3][y+5]=' ';
       a[x-3][y+6]='|';
       a[x-4][y+1]='/';
       a[x-4][y+2]=' ';
       a[x-4][y+3]=' ';
        a[x-4][y+4]=' ';
       a[x-4][y+5]='/';
       a[x-4][y+6]='|';
       a[x-5][y+2]='+';
       a[x-5][y+3]='-';
       a[x-5][y+4]='-';
       a[x-5][y+5]='-';
       a[x-5][y+6]='+';
        };
    
    for(i=1000-maxh;i!=1001;i++)//1000-maxh 就是第一行 1000就是最后一行
    {   
        for(t=0;t<=2*m+4*n;t++)
        {   
            if(a[i][t]=='\0'){//开始输出点,如果从未被字母或者空格覆盖就 补充输出点(‘.’)
                printf(".");
                continue;//注意!!!一定要continue 不然会输出‘’即ASCII为0的字符 
                };//你看不见 但是oj看得见 (可以试着注释掉continue,你就会发现图形没变化,但出现WA了)                   
            printf("%c",a[i][t]);
        };
        printf("\n");
    };// 我比较菜  写的比较烂 大佬勿怪
    return 0;
}

1 条评论

  • @ 2022-10-22 9:48:17

    直接这么写就可以👀️

    char a[6][8] = {
        "..+---+",
        "./   /|",
        "+---+ |",
        "|   | +",
        "|   |/.",
        "+---+.."
    };
    
    • 1