zoukankan      html  css  js  c++  java
  • 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("
    "); 
    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  }
  • 相关阅读:
    Remove Element
    C++ 一些STL
    Two Pointers/hash/3Sum/4Sum类题目
    动态规划
    UVa 12657 双向链表
    并行运行环境
    多线程编程
    HTML XML CSS JS 迅速学习
    UVa 11988 数组模拟链表
    静态链表
  • 原文地址:https://www.cnblogs.com/bobble/p/6537497.html
Copyright © 2011-2022 走看看