Description
小光最近在学习几何变换,老师给他留了一个作业,在二维平面上有n个点(x,y),老师给了m个几何变换对n个点进行操作,要求小光输出变换后的n个点的坐标(x’,y’)。小光为了偷懒,请求你帮他写个程序来完成老师的作业。
由于小光刚刚学习几何变换,老师只会给出四种变换,如下:
平移变换: (x’,y’)=(x+p,y’+q) 程序的输入格式为:1 p q (p,q为整数)
缩放变换: (x’,y’)=(x*L,y*L) 程序的输入格式为:2 L (L为整数)
上下翻转: (x’,y’)=(x,-y) 程序的输入格式为:3
左右翻转: (x’,y’)=(-x,y) 程序的输入格式为:4
Input
N(1<=N<=10^5)
然后N个点(x,y) 其中x,y均为整数
M (1<=M<=10^5)
然后M个变换,输入格式如上所述。
Output
N个点的坐标
Sample Input
1 1
2 2
1
1 1 1
Sample Output
3 3
Hint
注意同一组数据中每个点进行的变换都相同。
Source
安徽省2014年“京胜杯”大学生程序设计竞赛
思路:一开始的想法是对每个坐标全部操作,然后超时,然后改用操作坐标的系数,最后全部乘一遍即可。
这题最让我郁闷的就是系数和坐标用long long 操作就WA,不是怕乘的太大了嘛,然后改成int就能过,实在是对合工大oj的测试数据表示不解,用long long在合工大宣城校区oj上提交都过了的,不能忍啊。
- /**AC
- * Project Name: 省赛
- * File Name: J.一道简单的几何变换.cpp
- * Created on: 2015年4月28日 下午3:35:33
- * Author: jtahstu
- * QQ: 1373758426 E-mail:1373758426@qq.com
- * Copyright (c) 2015, jtahstu , All Rights Reserved.
- */
- //2
- //1 1
- //2 2
- //1
- //1 1 1
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<string>
- #include<cstring>
- using namespace std;
- struct point{
- int x;
- int y;
- }a[10005];
- int main(){
- int m,n,b,p,q,l;
- while(scanf("%d",&n)==1){
- int a1=1,b1=0,c1=1,d1=0;
- for(int i=0;i<n;i++)
- scanf("%d%d",&a[i].x,&a[i].y);
- scanf("%d",&m);
- for(int i=0;i<m;i++){
- scanf("%d",&b);
- if(b==1){
- scanf("%d%d",&p,&q);
- b1+=p;
- d1+=q;
- }
- else if(b==2){
- scanf("%d",&l);
- a1*=l;
- b1*=l;
- c1*=l;
- d1*=l;
- }
- else if(b==3){
- c1=-c1;
- d1=-d1;
- }
- else if(b==4){
- a1=-a1;
- b1=-b1;
- }
- }
- for(int i=0;i<n;i++)
- printf("%d %d\n",a1*a[i].x+b1,c1*a[i].y+d1);
- }
- return 0;
- }
- /**超时
- * Project Name: 省赛
- * File Name: J.一道简单的几何变换.cpp
- * Created on: 2015年4月28日 下午3:35:33
- * Author: jtahstu
- * QQ: 1373758426 E-mail:1373758426@qq.com
- * Copyright (c) 2015, jtahstu , All Rights Reserved.
- */
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<string>
- #include<cstring>
- using namespace std;
- struct point{
- long long x;
- long long y;
- }a[100000];
- int main()
- {
- int m,n,b,p,q,l;
- while(scanf("%d",&n)==1){
- for(int i=0;i<n;i++)
- scanf("%lld%lld",&a[i].x,&a[i].y);
- scanf("%d",&m);
- for(int i=0;i<m;i++){
- scanf("%d",&b);
- if(b==1){
- scanf("%d%d",&p,&q);
- for(int i=0;i<n;i++){
- a[i].x+=p;
- a[i].y+=q;
- }
- }
- else if(b==2){
- scanf("%d",&l);
- for(int i=0;i<n;i++){
- a[i].x*=l;
- a[i].y*=l;
- }
- }
- else if(b==3){
- for(int i=0;i<n;i++)
- a[i].y*=-1;
- }
- else{
- for(int i=0;i<n;i++)
- a[i].x*=-1;
- }
- }
- for(int i=0;i<n;i++)
- printf("%lld %lld\n",a[i].x,a[i].y);
- }
- return 0;
- }