- 「入门题单7」模拟与高精度
模拟-立体图 题解 (纯C)
- 2022-10-21 19:13:24 @
`` 没有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 条评论
-
Floating Ocean Ocean! LV 10 SU @ 2022-10-22 9:48:17
直接这么写就可以👀️
char a[6][8] = { "..+---+", "./ /|", "+---+ |", "| | +", "| |/.", "+---+.." };
- 1