1 条题解

  • 0
    @ 2025-4-8 21:24:52

    解题思路

    这是一个图形绘制的题目,它根据输入的字符串 s 中的字符('A' 或 'V')来生成一系列的线段,最终绘制出一个图形。

    1. 初始设置

    • 初始位置设置为 (300, 420),然后移动到 (310, 420) 并绘制第一条线段。
    • 变量 sxsy 记录上一个点的坐标,exey 记录当前点的坐标。

    2. 处理输入字符串

    • 对于字符串 s 中的每个字符:
      • 如果是 'A',则计算下一个点的坐标 (x,y)(x, y)x=eysy+exx = ey - sy + ex y=sxex+eyy = sx - ex + ey
      • 如果是 'V',则计算下一个点的坐标 (x,y)(x, y)x=syey+exx = sy - ey + ex y=exsx+eyy = ex - sx + ey
    • 更新 sxsy 为上一个点的坐标,exey 为当前点的坐标,并绘制线段到 (x,y)(x, y)

    3. 输出结果

    • 最后输出 strokeshowpage,表示绘制完成并显示页面。

    数学公式说明

    • 对于 'A''V' 的计算,可以理解为基于向量的旋转:
      • 'A' 表示逆时针旋转 90 度:(x,y)=(eysy+ex,sxex+ey)(x, y) = (ey - sy + ex, sx - ex + ey)
      • 'V' 表示顺时针旋转 90 度:(x,y)=(syey+ex,exsx+ey)(x, y) = (sy - ey + ex, ex - sx + ey)

    示例

    假设输入字符串为 "AVA",则绘制过程如下:

    1. 初始线段:(300,420)(300, 420)(310,420)(310, 420)
    2. 遇到 'A',计算新点 (420420+310,300310+420)=(310,410)(420 - 420 + 310, 300 - 310 + 420) = (310, 410)
    3. 遇到 'V',计算新点 (420410+310,310310+410)=(320,410)(420 - 410 + 310, 310 - 310 + 410) = (320, 410)
    4. 遇到 'A',计算新点 (410410+320,310320+410)=(320,400)(410 - 410 + 320, 310 - 320 + 410) = (320, 400)。 最终绘制的图形由这些线段组成。
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #define maxn 202
    using namespace std;
    char s[maxn];
    int main(){
        while(~scanf("%s",s)){
            puts("300 420 moveto\n310 420 lineto");
            int sx=300,sy=420;
            int ex=310,ey=420;
            int x,y;
            for(int i=0;s[i]!=0;++i){
                if(s[i]=='A'){
                    x=ey-sy+ex;
                    y=sx-ex+ey;
                }
                else if(s[i]=='V'){
                    x=sy-ey+ex;
                    y=ex-sx+ey;
                }
                sx=ex;
                sy=ey;
                ex=x;
                ey=y;
                printf("%d %d lineto\n",x,y);
            }
            puts("stroke\nshowpage");
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1557
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者