目录
【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列的矩阵绘制立体图,每个格子中的数字表示该位置堆叠的积木数。积木的绘制遵循特定格式,使用字符'+'、'-'、'/'、'|'和'.'(背景)构成。要求输出绘制后的最小字符矩阵。
解题思路
- 模拟绘制过程:逐块绘制积木,按从后到前、从下到上的顺序处理,确保前面的积木覆盖后面的。
- 计算坐标:每个积木的左上角位置由其在原矩阵的行列及高度决定。设当前处理格子为第i行第j列,第k个积木(从下往上),其左上角坐标为:
- 纵向:
sx = (m-1 - i) * 2 + 3 * k
- 横向:
sy = (m-1 - i) * 2 + 4 * j
- 纵向:
- 更新画布大小:每次绘制积木时,动态更新画布的最大行数N和列数M。
- 填充背景:输出时,未被覆盖的位置用'.'填充。
实现代码
#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;
}
代码说明
- 输入处理:读取m和n,接着读取m行n列的积木数到数组
a
。 - 绘制积木:
paint
函数将单个积木的六个面绘制到画布的指定位置。 - 坐标计算:三重循环遍历每个格子及其积木,计算左上角坐标,并更新画布最大尺寸。
- 输出画布:从最后一行开始输出,未覆盖的位置用'.'填充。
此解法正确模拟了立体图的绘制过程,确保每个积木的位置和遮挡关系正确,最终输出符合要求的字符矩阵。
三、其它说明
1、本次题解使用AI撰写偿试了十几次方案,仅展示的方案是正确的,其它方案的程序要么不能编译,要么答案错误。
2、本方案提供的例程通过Cena测评通过。