华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1113|回复: 3
打印 上一主题 下一主题

P1058 立体图

[复制链接]

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
跳转到指定楼层
楼主
发表于 2018-6-25 16:38:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 吴语林 于 2018-6-25 16:39 编辑


https://www.luogu.org/problemnew/show/P1058题目描述
小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为 m \times nm×n 的矩形区域,上面有 m \times nm×n 个边长为 11 的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是 11 ),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:
每个顶点用 11 个加号’ ++ ’表示,长用 33 个” -− ”表示,宽用 11 个”/”,高用两个”|”表示。字符’ ++ ’,” -− ”,”/”,”|”的 ASCIIASCII 码分别为 4343 , 4545 , 4747 , 124124 。字符’.’( ASCIIASCII 码 4646 )需要作为背景输出,即立体图里的空白部分需要用’.’来代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
若两块积木上下相邻,图示为:
若两块积木前后相邻,图示为:
立体图中,定义位于第 (m,1(m,1 )的格子(即第 mm 行第 11 列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
输入输出格式输入格式:

第一行有用空格隔开的 22 个整数 mm 和 nn ,表示有 m \times nm×n 个格子 (1 \le m,n \le 50)(1≤m,n≤50) 。
接下来的 mm 行,是一个 m \times nm×n 的矩阵,每行有 nn 个用空格隔开的整数,其中第 ii 行第 jj 列上的整数表示第 ii 行第 jj 列的个子上摞有多少个积木( 1 \le1≤ 每个格子上的积木数 \le 100≤100 )。

输出格式:

输出包含题目要求的立体图,是一个 KK 行 LL 列的字符串矩阵,其中 KK 和 LL 表示最少需要 KK 行 LL 列才能按规定输出立体图。
回复

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
沙发
 楼主| 发表于 2018-6-25 16:40:27 | 只看该作者
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. char a[8100][8100],c[10][10]={
  14. "..+---+",
  15. "./   /|",
  16. "+---+ |",
  17. "|   | +",
  18. "|   |/.",
  19. "+---+..",
  20. };
  21. int b[100][100],xmax=-1,xmin=0x3f3f3f3f,ymax=-1,ymin=0x3f3f3f3f,n,m;
  22. void draw(int x,int y)
  23. {
  24.         for(int i=0;i<6;i++)
  25.                 for(int j=0;j<7;j++)
  26.                         if(c[i][j]!='.')
  27.                                 a[x+i][y+j]=c[i][j];
  28.         xmax=max(x+5,xmax);
  29.         xmin=min(x,xmin);
  30.         ymax=max(y+6,ymax);
  31.         ymin=min(y,ymin);       
  32. }
  33. int main()
  34. {
  35.         scanf("%d%d",&n,&m);
  36.         for(int i=1;i<=n;i++)
  37.                 for(int j=1;j<=m;j++)
  38.                         scanf("%d",&b[i][j]);
  39.         for(int i=1;i<=n;i++)
  40.                 for(int j=1;j<=m;j++)
  41.                         for(int h=1;h<=b[i][j];h++)
  42.                                 draw(4000+(i-1)*2-(h-1)*3,4000-(i-1)*2+(j-1)*4);               
  43.         for(int i=xmin;i<=xmax;i++)
  44.         {
  45.                 for(int j=ymin;j<=ymax;j++)
  46.                         if(a[i][j]==0)
  47.                                 printf(".");
  48.                         else
  49.                                 printf("%c",a[i][j]);
  50.                 printf("\n");
  51.         }       
  52.         return 0;
  53. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
板凳
发表于 2018-6-25 22:17:21 | 只看该作者
楼上吴同学很认真 仔细的调出来了这个程序!
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
地板
发表于 2018-9-30 17:09:01 | 只看该作者
  1. #include<iostream>
  2. #define FOR(i,a,b) for(int i=a;i<=b;i++)
  3. #define ROF(i,a,b) for(int i=a;i>=b;i--)
  4. using namespace std;
  5. const int N=105;
  6. int n,m,num[N][N],z[6]={2,1,0,0,0,0},s[6]={6,6,6,6,5,4},maxx=0,maxy=0;
  7. char one[10][10]=
  8. {
  9. "  +---+",
  10. " /   /|",
  11. "+---+ |",
  12. "|   | +",
  13. "|   |/ ",
  14. "+---+  ",
  15. },c[1010][1010];
  16. void make(int x,int y)
  17. {
  18.     ROF(i,5,0)
  19.     FOR(j,z[i],s[i])
  20.     {
  21.         c[5-i+x][j+y]=one[i][j];
  22.         maxx=max(maxx,5-i+x);maxy=max(maxy,j+y);
  23.     }
  24. }
  25. int main()
  26. {
  27.     cin>>n>>m;
  28.     FOR(i,1,n)FOR(j,0,m-1)cin>>num[i][j];
  29.     FOR(i,1,n)FOR(j,0,m-1)FOR(k,0,num[i][j]-1)
  30.     make((n-i)*2+1+3*k,(n-i)*2+1+4*j);
  31.     ROF(i,maxx,1)
  32.     {
  33.         FOR(j,1,maxy)
  34.             if(c[i][j]=='\000') cout<<".";
  35.             else cout<<c[i][j];
  36.         cout<<endl;
  37.     }
  38.     return 0;
  39. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 01:34 , Processed in 0.237353 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表