1 条题解

  • 0
    @ 2025-10-8 16:52:54
    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        double a[4][4];
        node(){memset(a,0,sizeof a);}
    };
    node P[11000];//P数组记录的是由各个点的坐标(只用第一列)
    node pre1,pre2,pre3,pre4,pre5;
    //pre1~5矩阵记录的操作顺序为图片所示
    node operator* (node A,node B)//
    {
        node C;
        for(int i=1;i<=3;i++)
            for(int j=1;j<=3;j++)
                for(int k=1;k<=3;k++)
                    C.a[i][j]+=A.a[i][k]*B.a[k][j];
        return C;
    }
    int main()
    {
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%lf%lf",&P[i].a[1][1],&P[i].a[2][1]),P[i].a[3][1]=1;
        node f;
        for(int i=1;i<=3;i++)f.a[i][i]=1.0;//f一开始为单位矩阵(即在矩阵乘法中是等于数字乘法中1的存在)
        
    	pre1.a[1][1]=pre1.a[2][2]=pre1.a[3][3]=1.0;
    	
        pre2.a[3][3]=1.0;
        
        pre3.a[1][1]=pre3.a[3][3]=1.0;pre3.a[2][2]=-1.0;
        
        pre4.a[1][1]=-1.0;pre4.a[2][2]=pre4.a[3][3]=1.0;
        
        pre5.a[3][3]=1.0;
        
        //先预处理一下,把不变的都填上
        double x,y,pi=acos(-1.0);;
        for(int i=1;i<=m;i++)
        {
            char s[5];scanf("%s",s+1);
            if(s[1]=='M')
            {
                scanf("%lf%lf",&x,&y);
                pre1.a[1][3]=x;pre1.a[2][3]=y;f=pre1*f;
                //两个的顺序一定不能改变,因为矩阵乘法不满足交换律
            }
            if(s[1]=='S')
            {
                scanf("%lf",&x);
                pre2.a[1][1]=pre2.a[2][2]=x;f=pre2*f;
            }
            if(s[1]=='X')f=pre3*f;
            if(s[1]=='Y')f=pre4*f;
            if(s[1]=='R')
            {
                scanf("%lf",&x);
                double aa=pi*x/180.0;
                pre5.a[1][1]=pre5.a[2][2]=cos(aa);
                pre5.a[1][2]=-sin(aa);pre5.a[2][1]=sin(aa);
                f=pre5*f;
            }
        }
        //计算结果矩阵
        for(int i=1;i<=n;i++)
        {
            P[i]=f*P[i];//最后把结果矩阵乘坐标矩阵
            printf("%.1lf %.1lf\n",P[i].a[1][1],P[i].a[2][1]);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    595
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    26
    已通过
    10
    上传者