Cod sursa(job #1501868)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 octombrie 2015 21:53:27
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <cstdio>
#define INF 1000000000000000LL
#define k 6
long long x1[k], x2[k], y1[k], y2[k], c[k], d[1<<k][k], best[k];
inline long long myabs(long long a){
    if(a<0){
        return -a;
    }
    return a;
}
int main(){
    int i, t, j, p;
    long long n, m, ans;
    FILE *fin, *fout;
    fin=fopen("portal3.in", "r");
    fout=fopen("portal3.out", "w");
    fscanf(fin, "%d", &t);
    for(; t; t--){
        fscanf(fin, "%lld%lld", &n, &m);
        for(i=0; i<k/2; i++){
            fscanf(fin, "%lld%lld%lld%lld%lld", &x1[i], &y1[i], &x2[i], &y2[i], &c[i]);
            best[i]=INF;
        }
        for(i=k/2; i<k; i++){
            x1[i]=x2[i-k/2];
            y1[i]=y2[i-k/2];
            x2[i]=x1[i-k/2];
            y2[i]=y1[i-k/2];
            c[i]=c[i-k/2];
            best[i]=INF;
        }
        for(i=1; i<(1<<k); i++){
            for(j=0; j<k; j++){
                if(i&(1<<j)){
                    if(i==(1<<j)){
                        d[i][j]=c[j]+x1[j]+y1[j];
                    }else{
                        d[i][j]=INF;
                        for(p=0; p<k; p++){
                            if((p!=j)&&(i&(1<<p))&&(d[i][j]>c[j]+d[i^(1<<j)][p]+myabs(x2[p]-x1[j])+myabs(y2[p]-y1[j]))){
                                d[i][j]=c[j]+d[i^(1<<j)][p]+myabs(x2[p]-x1[j])+myabs(y2[p]-y1[j]);
                            }
                        }
                    }
                    if(best[j]>d[i][j]){
                        best[j]=d[i][j];
                    }
                }else{
                    d[i][j]=INF;
                }
            }
        }
        ans=n+m;
        for(i=0; i<k; i++){
            if(ans>best[i]+myabs(n-x2[i])+myabs(m-y2[i])){
                ans=best[i]+myabs(n-x2[i])+myabs(m-y2[i]);
            }
        }
        fprintf(fout, "%lld\n", ans);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}