NYOJ 298 点的变换
题目链接:298 点的变换
这题放在矩阵快速幂里,我一开始想不透它是怎么和矩阵搭上边的,然后写了个暴力的果然超时,上网看了题解后,发现竟然能够构造一些精巧的矩阵来处理,不得不说实在太强大了! http://blog.csdn.net/lyhvoyage/article/details/39755595
然后我的代码是:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<cstdlib> 5 #include<iostream> 6 using namespace std; 7 #define For(i,s,t) for(int i=s; i<=t; ++i) 8 const double pi= acos(-1.0); 9 10 struct matrix{ 11 int r,c; 12 double a[5][5]; 13 matrix(): r(3),c(3){ 14 memset(a,0,sizeof(a)); 15 a[3][3]= 1.0; 16 } 17 matrix(char ch){ 18 new (this)matrix(); 19 if(ch=='x' || ch=='X'){ 20 a[1][1]= 1.0; 21 a[2][2]= -1.0; 22 } 23 else if(ch=='y' || ch== 'Y'){ 24 a[2][2]= 1.0; 25 a[1][1]= -1.0; 26 } 27 else if(ch=='E'){ 28 a[1][1]= a[2][2]= 1.0; 29 } 30 } 31 matrix(double p, char ch){ 32 new (this)matrix(); 33 if(ch=='s' || ch== 'S'){ 34 a[1][1]= a[2][2]= p; 35 } 36 else if(ch=='r' || ch=='R'){ 37 a[1][1]= a[2][2]= cos(p); 38 a[1][2]= sin(p); 39 a[2][1]= -sin(p); 40 } 41 } 42 matrix(double dx, double dy, char ch){ 43 if(ch=='p'|| ch=='P'){ 44 new (this)matrix(); 45 r= 1; 46 a[1][1]= dx; 47 a[1][2]= dy; 48 a[1][3]= 1.0; 49 } 50 else if(ch=='M' || ch=='m'){ 51 new (this)matrix(); 52 a[1][1]= a[2][2]= 1.0; 53 a[3][1]= dx; 54 a[3][2]= dy; 55 } 56 } 57 matrix operator *(const matrix &m2) const { 58 matrix mul; 59 mul.r= r; 60 mul.c= m2.c; 61 mul.a[3][3]= 0.0; 62 For(i,1,r) For(j,1,m2.c) For(k,1,c) 63 mul.a[i][j]+= a[i][k]*m2.a[k][j]; 64 return mul; 65 } 66 } point[10005]; 67 68 int main() 69 { 70 int n,m; 71 scanf("%d%d",&n,&m); 72 double x,y; 73 for(int i=1; i<=n; ++i){ 74 scanf("%lf %lf",&x,&y); 75 point[i]= matrix(x,y,'p'); 76 } 77 matrix ans('E'); 78 while(m--){ 79 char ch; 80 cin>>ch; 81 if(ch =='X') ans= ans*matrix('X'); 82 else if(ch=='Y') ans= ans*matrix('Y'); 83 else if(ch=='M'){ 84 double dx,dy; 85 scanf("%lf %lf",&dx,&dy); 86 ans= ans*matrix(dx,dy,'M'); 87 } 88 else if(ch=='S'){ 89 double p; 90 scanf("%lf",&p); 91 ans= ans*matrix(p,'S'); 92 } 93 else if(ch=='R'){ 94 double rad; 95 scanf("%lf",&rad); 96 rad= rad/180*pi; 97 ans= ans*matrix(rad,'R'); 98 } 99 } 100 for(int i=1; i<=n; ++i){ 101 point[i]= point[i]*ans; 102 printf("%.1f %.1f\n",point[i].a[1][1],point[i].a[1][2]); 103 } 104 return 0; 105 }
还是第一次写了超过100行的代码,调试了好久了,唉~~
然后,稍微作了下更改,还有另一个版本的:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<cstdlib> 5 using namespace std; 6 #define For(i,s,t) for(int i=s; i<=t; ++i) 7 const double pi= acos(-1.0); 8 9 struct matrix{ 10 int r,c; 11 double a[5][5]; 12 void init(int r=3, int c=3){ 13 this->r = r; 14 this->c = c; 15 memset(a,0,sizeof(a)); 16 a[3][3]= 1.0; 17 } 18 matrix() { init(); } 19 matrix(char ch){ 20 init(); 21 if(ch=='x' || ch=='X'){ 22 a[1][1]= 1.0; 23 a[2][2]= -1.0; 24 } 25 else if(ch=='y' || ch== 'Y'){ 26 a[2][2]= 1.0; 27 a[1][1]= -1.0; 28 } 29 else if(ch=='E'){ 30 a[1][1]= a[2][2]= 1.0; 31 } 32 } 33 matrix(double p, char ch){ 34 init(); 35 if(ch=='s' || ch== 'S'){ 36 a[1][1]= a[2][2]= p; 37 } 38 else if(ch=='r' || ch=='R'){ 39 a[1][1]= a[2][2]= cos(p); 40 a[1][2]= sin(p); 41 a[2][1]= -sin(p); 42 } 43 } 44 matrix(double dx, double dy, char ch){ 45 if(ch=='p'|| ch=='P'){ 46 init(1,3); 47 a[1][1]= dx; 48 a[1][2]= dy; 49 a[1][3]= 1.0; 50 } 51 else if(ch=='M' || ch=='m'){ 52 init(); 53 a[1][1]= a[2][2]= 1.0; 54 a[3][1]= dx; 55 a[3][2]= dy; 56 } 57 } 58 matrix operator *(const matrix &m2) const { 59 matrix mul; 60 mul.init(r,m2.c); 61 mul.a[3][3]= 0.0; 62 For(i,1,r) For(j,1,m2.c) For(k,1,c) 63 mul.a[i][j]+= a[i][k]*m2.a[k][j]; 64 return mul; 65 } 66 } point[10005]; 67 68 int main() 69 { 70 int n,m; 71 scanf("%d%d",&n,&m); 72 double x,y; 73 for(int i=1; i<=n; ++i){ 74 scanf("%lf %lf",&x,&y); 75 point[i]= matrix(x,y,'p'); 76 } 77 matrix ans('E'); 78 while(m--){ 79 getchar(); 80 char ch= getchar(); 81 if(ch =='X') ans= ans*matrix('X'); 82 else if(ch=='Y') ans= ans*matrix('Y'); 83 else if(ch=='M'){ 84 double dx,dy; 85 scanf("%lf %lf",&dx,&dy); 86 ans= ans*matrix(dx,dy,'M'); 87 } 88 else if(ch=='S'){ 89 double p; 90 scanf("%lf",&p); 91 ans= ans*matrix(p,'S'); 92 } 93 else if(ch=='R'){ 94 double rad; 95 scanf("%lf",&rad); 96 rad= rad/180*pi; 97 ans= ans*matrix(rad,'R'); 98 } 99 } 100 for(int i=1; i<=n; ++i){ 101 point[i]= point[i]*ans; 102 printf("%.1f %.1f\n",point[i].a[1][1],point[i].a[1][2]); 103 } 104 return 0; 105 }