Toán tin vuotlen.com

Tìm điểm Fermat (Thuật toán leo đồi)

// tim diem fermat
#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> diem;
#define x first
#define y second

double kc(diem A, diem B){
    A.x-=B.x; A.y-=B.y;
    return sqrt(A.x*A.x + A.y*A.y);
}

int main() 
{
    diem A, B, C, M;
    cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y;
    M={(A.x+B.x+C.x)/3, (A.y+B.y+C.y)/3};
    double eps = 1e-4, k = kc(A, M)+ kc(B, M) + kc(C, M), d = 10;
    while(d>eps){
        diem Next[]={{M.x-d, M.y},{M.x+d, M.y},{M.x, M.y-d},{M.x, M.y+d}};
        for(diem N:Next){
            double z=kc(A, N)+ kc(B, N) + kc(C, N);
            if(z<k){
                k=z;
                M=N;
                d=d*2;
                break;    
            }
            d/=2;
        }
    }
    cout<<k;
}