CODEVS 1149 立体图

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

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

每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”|”表示。字符’+’ ‘-‘’/’ ‘|’的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
..+—+—+
./ / /|
+—+—+ |
| | | +
| | |/.
+—+—+..
若两块积木上下相邻,图示为:
..+—+
./ /|
+—+ |
| | +
| |/|
+—+ |
| | +
| |/.
+—+..
若两块积木前后相邻,图示为:
….+—+
…/ /|
..+—+ |
./ /| +
+—+ |/.
| | +..
| |/…
+—+….
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
输入描述 Input Description
输入文件drawing.in第一行有用空格隔开的两个整数m和n,表示有m*n个格子(1<=m,n<=50)。

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

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

样例输入 Sample Input
3 4

2 2 1 2

2 2 1 1

3 2 1 2

样例输出 Sample Output
……+—+—+…+—+
..+—+../ /|../ /|
./ /|-+—+ |.+—+ |
+—+ |/ /| +-| | +
| | +—+ |/+—+ |/|
| |/ /| +/ /|-+ |
+—+—+ |/+—+ |/| +
| | | +-| | + |/.
| | |/ | |/| +..
+—+—+—+—+ |/…
| | | | | +….
| | | | |/…..
+—+—+—+—+……*/
23333来填一个旧坑。
首先要根据矩阵预处理出这个图的高和宽。
然后根据它是第几行第几列处理出在哪里放这个方块。

#include<cstdio>
#include<iostream>
using namespace std;
int n;
int m;
int num[100][100];
char map[1000][1000];
int gao,kuan;
int getgao(int i,int j,int x)
{
    int ans=0;
    ans+=(x+1)*3;
    ans+=(n-i)*2;
    return ans;
}
int getkuan(int i,int j)
{
    int ans=0;
    ans+=(n-i+1)*2;
    ans+=(j*4)+1;
    return ans;
}

void fang1(int x,int y)
{
    /*map[x-5][y]='.',map[x-5][y+1]='.'*/map[x-5][y+2]='+',map[x-5][y+3]='-',map[x-5][y+4]='-',map[x-5][y+5]='-',map[x-5][y+6]='+';
    /*map[x-4][y]='.'*/map[x-4][y+1]='/',map[x-4][y+2]=' ',map[x-4][y+3]=' ',map[x-4][y+4]=' ',map[x-4][y+5]='/',map[x-4][y+6]='|';
    map[x-3][y]='+',map[x-3][y+1]='-',map[x-3][y+2]='-',map[x-3][y+3]='-',map[x-3][y+4]='+',map[x-3][y+5]=' ',map[x-3][y+6]='|';
    map[x-2][y]='|',map[x-2][y+1]=' ',map[x-2][y+2]=' ',map[x-2][y+3]=' ',map[x-2][y+4]='|',map[x-2][y+5]=' ',map[x-2][y+6]='+';
    map[x-1][y]='|',map[x-1][y+1]=' ',map[x-1][y+2]=' ',map[x-1][y+3]=' ',map[x-1][y+4]='|',map[x-1][y+5]='/'/*,map[x-1][y+6]='.'*/;
    map[x][y]='+',map[x][y+1]='-',map[x][y+2]='-',map[x][y+3]='-',map[x][y+4]='+'/*map[x][y+5]='.',map[x][y+6]='.'*/;
}
void fang(int x,int y,int cnt)
{
    int xx=gao-(n-x)*2;
    int yy=(n-x)*2+1+(y-1)*4;

    while(cnt>=1)
    {
        fang1(xx,yy);
        xx-=3;
        cnt--;
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&num[i][j]);
            gao=max(getgao(i,j,num[i][j]),gao);
            kuan=max(getkuan(i,j),kuan);
        }
    }
    for(int i=1;i<=gao;i++)
    for(int j=1;j<=kuan;j++)
        map[i][j]='.';
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            fang(i,j,num[i][j]);
        }
    }
//  printf("%d %d\n",gao,kuan); 
    for(int i=1;i<=gao;i++)
    {
        for(int j=1;j<=kuan;j++)
        {
            printf("%c",map[i][j]);
        }
        puts("");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值