NOIP2008pj & luoguP1058 立体图 模拟

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 4
2 2 1 2
2 2 1 1
3 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 立体图 模拟的主要内容,如果未能解决你的问题,请参考以下文章

Noip2015pj求和

NOIP2003pj数字游戏[环形DP]

NOIP2002pj产生数[floyd 高精度]

[NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP

NOIP2017 PJ全记录

NOIP2014pj子矩阵[搜索|DP]