1 条题解
-
0
#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
- 上传者