首页 > 代码库 > NOIP2008pj & luoguP1058 立体图 模拟

NOIP2008pj & luoguP1058 立体图 模拟

P1058 立体图

题目描述

小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。

小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:

技术分享

每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示。字符’+’,”-”,”/”,”|”的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’来代替。立体图的画法如下面的规则:

若两块积木左右相邻,图示为:

技术分享

若两块积木上下相邻,图示为:

技术分享

若两块积木前后相邻,图示为:

技术分享

立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。

输入输出格式

输入格式:

 

输入文件drawing.in第一行有用空格隔开的2个整数m和n,表示有m*n个格子(1<=m,n<=50)。

接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的个子上摞有多少个积木(1<=每个格子上的积木数<=100)。

 

输出格式:

 

输出文件drawing.out中包含题目要求的立体图,是一个K行L列的字符串矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。

 

输入输出样例

输入样例#1:
3 42 2 1 22 2 1 13 2 1 2
输出样例#1:
......+---+---+...+---+..+---+  /   /|../   /|./   /|-+---+ |.+---+ |+---+ |/   /| +-|   | +|   | +---+ |/+---+ |/||   |/   /| +/   /|-+ |+---+---+ |/+---+ |/| +|   |   | +-|   | + |/.|   |   |/  |   |/| +..+---+---+---+---+ |/...|   |   |   |   | +....|   |   |   |   |/.....+---+---+---+---+......

说明

NOIP2008普及组第四题

 

思路

补题中。。。

咳咳,题目非常亲民啊2333

模拟赛(模拟大赛qwq)时差点就打粗来了,结果还以为自己是错的就弃疗了【忧桑

 

因为我们看到的是这个立方体的前面右面和上面,

所以我们只要从左往右,从下往上,从后往前,就可以了

先把画布清一色的背景填充好

然后计算画布最左下角的坐标s_hang,s_lie和画布大小k,l

然后在画得时候计算找到每个方块左上角绘制就可以了

具体怎么计算呢?

技术分享

哦,还有,就是在绘制的时候如果是‘.‘就不绘制了。。

代码

第一次用cpp打题,好激动

 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 char power[6][8]={ 5     "..+---+", 6     "./   /|", 7     "+---+ |", 8     "|   | +", 9     "|   |/.",10     "+---+.."11 };12 char mmap[1000][1000];13 int n,m;14 int a[1000][1000];15 int k,l,s_hang,s_lie;16 17 void outgo(){18    for (int i=1;i<=k;i++)19     { 20       for (int j=1;j<=l;j++)21         printf("%c",mmap[i][j]);22       printf("\n"); 23     } 24 } 25 26 void draw(int i,int j,int k){27     int lie=s_lie+2*(m-i)+4*(j-1);28     int hang=s_hang-(m-i+1)*2-3*k;29     30     for (int i=0;i<=5;i++)31       for (int j=0;j<=6;j++)32       {33           if (power[i][j]!=.) mmap[hang+i][lie+j]=power[i][j];34       }35 //    outgo();36 }37 38 void init(){39     memset(mmap,.,sizeof(mmap));40    scanf("%d %d",&m,&n);41    l=4*n+1+2*m;42    for (int i=1;i<=m;i++)43      for (int j=1;j<=n;j++)44      {45          scanf("%d",&a[i][j]);46          k=max(k,3*a[i][j]+1+2*(m-i+1));47      }48    s_hang=k;   s_lie=1;49     for (int i=1;i<=m;i++)50       for (int j=1;j<=n;j++)51         for (int k=1;k<=a[i][j];k++)52           draw(i,j,k); 53 }54 55 int main(){56     57    freopen("drawing.in","r",stdin);58    freopen("drawing.out","w",stdout);    59    init();60    outgo();61    fclose(stdin);62    fclose(stdout);63    64    return 0;65  }

 

NOIP2008pj & luoguP1058 立体图 模拟