hdu 6465 线性变换高斯消元
http://acm.hdu.edu.cn/showproblem.php?pid=6465
题意
给你三个点,再给你经过线性变换后的三个点,然后q次询问,给你一个点,需要你输出线性变换后的点
题解
- 线性变换:
- \(a_1x+b_1y+c_1=X\)
 - \(a_2x+b_2y+c_2=Y\)
 
 - 构造高斯消元矩阵,Y同理
 
\[ \left[
 \begin{matrix}
   1 & x_1 & y_1 \\
   1 & x_2 & y_2 \\
   1 & x_3 & y_3
  \end{matrix}
  \right] 
  \left[
  \begin{matrix}
   a_1 \\
   b_1 \\
   c_1
  \end{matrix}
  \right]=\left[
  \begin{matrix}
   X_1 \\
   X_2 \\
   X_3
  \end{matrix}
  \right]  
\]
代码
#include<bits/stdc++.h>
using namespace std;
void gao(double c[5][5]){
    for(int i=1;i<=3;i++){
        for(int j=i+1;j<=3;j++){
            double rate=c[j][i]*1.0/c[i][i];
            for(int k=i;k<=4;k++){
                c[j][k]-=c[i][k]*rate;
            }
        }
    }
    for(int i=3;i>=1;i--){
        for(int j=i-1;j>=1;j--){
            double rate=c[j][i]*1.0/c[i][i];
            c[j][4]-=c[i][4]*rate;
        }
        c[i][i]=c[i][4]/c[i][i];
    }
}
double a[5][5],b[5][5];
int q,T;
double x,y,X,Y;
int main(){
    cin>>T;
    while(T--){
        scanf("%lf%lf%lf%lf%lf%lf",&a[1][2],&a[1][3],&a[2][2],&a[2][3],&a[3][2],&a[3][3]);
        a[1][1]=a[2][1]=a[3][1]=1;
        for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)b[i][j]=a[i][j];
        scanf("%lf%lf%lf%lf%lf%lf",&a[1][4],&b[1][4],&a[2][4],&b[2][4],&a[3][4],&b[3][4]);
        gao(a);gao(b);
        scanf("%d",&q);
        while(q--){
            scanf("%lf%lf",&x,&y);
            X=1*a[1][1]+x*a[2][2]+y*a[3][3];
            Y=1*b[1][1]+x*b[2][2]+y*b[3][3];
            printf("%.2f %.2f\n",X,Y);
        }
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号