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[ egin{matrix} 1 & x_1 & y_1 \ 1 & x_2 & y_2 \ 1 & x_3 & y_3 end{matrix} ight] left[ egin{matrix} a_1 \ b_1 \ c_1 end{matrix} ight]=left[ egin{matrix} X_1 \ X_2 \ X_3 end{matrix} ight] ]

代码

#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
",X,Y);
        }
    }
}
原文地址:https://www.cnblogs.com/VIrtu0s0/p/10816390.html