【IMA+DeepSeekR1+本地文件】撰写NOIP2008普及组T4【立体图】题解

目录

一、提问词

二、IMA+DeepSeekR1回复

题目描述

解题思路

实现代码

代码说明

三、其它说明


【IMA+DeepSeekR1+本地知识库】撰写NOIP2008普及组复赛题解系列

1、IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T1【ISBN 号码】题解_本地知识库撰写文章-优快云博客

2、IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T2【排座椅】题解-优快云博客

3、IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T3【传球游戏】题解-优快云博客

4、【IMA+DeepSeekR1+本地文件】撰写NOIP2008普及组T4【立体图】题解-优快云博客

一、提问词

请撰写NOIP2008普及组T4【立体图】题解,要求:
一、从文件“drawing.in”读数据,答案写入文件“drawing.out”。
二、题解至少包括以下几个部分:
1、题目描述
2、解题思路及推理过程
3、实现代码
4、代码说明
三、代码符合C++98规范的要求,且严格遵循文件操作规范。

二、IMA+DeepSeekR1回复

题目描述

小渊需要根据一个m行n列的矩阵绘制立体图,每个格子中的数字表示该位置堆叠的积木数。积木的绘制遵循特定格式,使用字符'+'、'-'、'/'、'|'和'.'(背景)构成。要求输出绘制后的最小字符矩阵。

解题思路

  1. 模拟绘制过程:逐块绘制积木,按从后到前、从下到上的顺序处理,确保前面的积木覆盖后面的。
  2. 计算坐标:每个积木的左上角位置由其在原矩阵的行列及高度决定。设当前处理格子为第i行第j列,第k个积木(从下往上),其左上角坐标为:
    • 纵向:sx = (m-1 - i) * 2 + 3 * k
    • 横向:sy = (m-1 - i) * 2 + 4 * j
  3. 更新画布大小:每次绘制积木时,动态更新画布的最大行数N和列数M。
  4. 填充背景:输出时,未被覆盖的位置用'.'填充。

实现代码

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int maxn = 1000;
int m, n, a[maxn][maxn], N, M;
char s[maxn][maxn];

void my_copy(char *s, char *t) {
    while (*t) *s++ = *t++;
}

void paint(int x, int y) {
    my_copy(s[x] + y,   "+---+");
    my_copy(s[x+1] + y, "|   |/");
    my_copy(s[x+2] + y, "|   | +");
    my_copy(s[x+3] + y, "+---+ |");
    my_copy(s[x+4] + y + 1, "/   /|");
    my_copy(s[x+5] + y + 2, "+---+");
}

int main() {
    cin >> m >> n;
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            cin >> a[i][j];

    memset(s, 0, sizeof(s));
    N = M = 0;

    for (int j = 0; j < n; ++j) {
        for (int i = 0; i < m; ++i) {
            for (int k = 0; k < a[i][j]; ++k) {
                int sx = (m-1 - i) * 2 + 3 * k;
                int sy = (m-1 - i) * 2 + 4 * j;
                N = max(N, sx + 6);
                M = max(M, sy + 7);
                paint(sx, sy);
            }
        }
    }

    for (int i = N-1; i >= 0; --i) {
        for (int j = 0; j < M; ++j) {
            putchar(s[i][j] ? s[i][j] : '.');
        }
        putchar('\n');
    }

    return 0;
}

代码说明

  1. 输入处理:读取m和n,接着读取m行n列的积木数到数组a
  2. 绘制积木paint函数将单个积木的六个面绘制到画布的指定位置。
  3. 坐标计算:三重循环遍历每个格子及其积木,计算左上角坐标,并更新画布最大尺寸。
  4. 输出画布:从最后一行开始输出,未覆盖的位置用'.'填充。

此解法正确模拟了立体图的绘制过程,确保每个积木的位置和遮挡关系正确,最终输出符合要求的字符矩阵。

三、其它说明

1、本次题解使用AI撰写偿试了十几次方案,仅展示的方案是正确的,其它方案的程序要么不能编译,要么答案错误。

2、本方案提供的例程通过Cena测评通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liufangshun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值