[蒟蒻]
[----由于某OJ上这题是空白提交,就选你了,出来吧!#134!!][嗯,学习大佬,先做水题(虽然蒟蒻的我花了4小时)][bi~~~]
[#134 立体图]小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示。字符’+’,”-”,”/”,”|”的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’来代替。立体图的画法如下面的规则:若两块积木左右相邻,图示为:1若两块积木上下相邻,图示为:2若两块积木前后相邻,图示为:3
12
3
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
......【阅读效果差请搜索本体】
->
很好,根据标签分析,这是一道模(xu)拟(wei)题『不要问我这是什么,我不知道』;
所以基本思路......重点重点啦(敲黑板):思路是先把图形存在数组中,然后从后往前,从下往上,从左往右依次覆盖方块。
嘤嘤嘤,好水啊,所以呢?!
蒟蒻的我解题思路如下【dalao勿喷】
先定义一个单位方块:
然后进行地图和方块阵的初始化与输入:
注意一定要看清楚自己定义了什么!!
其中w(宽)h(高)需要计算,h还需要用比较,观察一下就好emmm..但一紧张估计就观察不到了呜呜呜呜
涂鸦操作如下,可以一位一位填充...
其中ix,iy是坐标系,一定记清下标;
最核心的问题无非在于确定那个小方块的某个特定角的坐标,这次我学习大佬,使用左下角定位法则,很容易观察到,按照从后往前,从下往上,从左往右的法则,坐标ix,iy如下图所示;
//嘤嘤嘤,其实我观察了好久,最后还看了dalao的程序以确认,虽然大佬的程序似乎完全不同..
然后把程序结合即可
#include<bits/stdc++.h>
using namespace std;
int imap[100][100]={};
int x=0,y=0;
char canvas[600][600]={};
int w=0,h=0;
const char cube[6][8]=
{
{"..+---+"},
{"./ /|"},
{"+---+ |"},
{"| | +"},
{"| |/."},
{"+---+.."}
}; //a standerd cube
inline void clear_canvas(void)
{
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
canvas[i][j]='.';
return;
}
void input_imap(void) //input the data
{
cin>>y>>x;
w=4*x+2*y+1;
for(int i=1;i<=y;i++)
for(int j=1;j<=x;j++)
{
cin>>imap[i][j]; //input the the values of the points
h=max(h,imap[i][j]*3+(y-i+1)*2+1);
}
return;
}
void output_canvas(void) //paint the canvas
{
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
cout<<canvas[i][j];
cout<<endl;
}
return;
}
void bits_paint(int ix,int iy) //paint cube in the canvas
{
for(int i=0;i<6;i++)
for(int j=0;j<7;j++)
if(cube[6-i-1][j]!='.')
canvas[ix-i][iy+j]=cube[6-i-1][j];
return;
}
void total_paint(void)
{
int ix=0,iy=0;
for(int i=1;i<=y;i++)
for(int j=1;j<=x;j++)
{
ix=h-2*(y-i);
iy=(y-i)*2+(j-1)*4+1;
while(imap[i][j]--)
{
bits_paint(ix,iy);
ix-=3;
}
}
return;
}
int main(void)
{
input_imap();
clear_canvas();
total_paint();
output_canvas();
return 0;
}
<-