一道簡單的幾何變換

一道簡單的幾何變換
運行時限: 1000 ms   單次運行時限: 1000 ms   內存限制: 64 MB
總提交: 68次   通過: 7次
Judge By Case
小光最近在學習幾何變換,老師給他留了一個作業,在二維平面上有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
N(1<=N<=10^5)
然後N個點(x,y) 其中x,y均爲整數
M (1<=M<=10^5)
然後M個變換,輸入格式如上所述。
N個點的座標
可見格式 帶空格和換行符的格式 帶空格和換行符的格式說明
2
1 1
2 2
1
1 1 1


Original Transformed 帶空格和換行符的格式說明
2 2
3 3
注意同一組數據中每個點進行的變換都相同。
安徽省2014年“京勝杯”大學生程序設計競賽
爲了節省時間必須要注意不能對單個座標計算 而是便輸出邊計算:
AC情況:

合工大AC情況:

代碼C:
# include <stdio.h>
# define N 100001
int A[2][N];
int main(){
    int W[4]={1,0,1,0},n,m,L,i,P,Q;
    while(scanf("%d",&n)==1)
    {
    for(i=0;i<n;i++)
      scanf("%d%d",&A[0][i],&A[1][i]);
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
        scanf("%d",&L);
        if(L==1){
        scanf("%d%d",&P,&Q);
        W[1]+=P;
        W[3]+=Q;
        }
       else if(L==2){
        scanf("%d",&P);
        Q=0;
        while(Q<4)
        W[Q++]*=P;
       }
       else if(L==3){
        W[2]=-W[2];
        W[3]=-W[3];
       }
       else{
        W[0]=-W[0];
        W[1]=-W[1];
       }
    }
    for(i=0;i<n;i++)
    printf("%d %d\n",W[0]*A[0][i]+W[1],W[2]*A[1][i]+W[3]);
       W[0]=W[2]=1;
       W[1]=W[3]=0;
   }
    return 0; 
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章