首页 > 其他 > 详细

NYOJ 298 点的变换

时间:2015-04-21 22:06:48      阅读:195      评论:0      收藏:0      [点我收藏+]

  题目链接: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 }
View Code

  还是第一次写了超过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 }
View Code

NYOJ 298 点的变换

原文:http://www.cnblogs.com/Newdawn/p/4445533.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!