Cod sursa(job #635685)

Utilizator zloteanu.adrianzloteanu adrian nichita zloteanu.adrian Data 19 noiembrie 2011 14:09:50
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.84 kb
#include<stdio.h>
#include <stdlib.h>
using namespace std;
struct Punct
{
    long x,y;
};
struct Portal
{
    Punct init,Destinatie;
    long timp;
};
Punct final;
Portal portale[4];
long dist(Punct a,Punct b)
{
    return abs(a.x-b.x)+abs(a.y-b.y);
}
long dmin=-1;
void back(Punct start,long pasi, long trecutprin[4])
{
    long d1=pasi+dist(start,final);
    long backu[4];
    backu[1]=trecutprin[1];
    backu[2]=trecutprin[2];
    backu[3]=trecutprin[3];
    if(d1<dmin||dmin==-1)
    {
        dmin=d1;
    }
    for(long i=1; i<=3; i++)
        if(trecutprin[i]==false)
        {
            trecutprin[i]=true;
            backu[i]=true;
            d1=dist(start,portale[i].init);
            back(portale[i].Destinatie,pasi+d1+portale[i].timp,trecutprin);
            for(long j=1; j<=3; j++)
                trecutprin[j]=backu[j];
            d1=dist(start,portale[i].Destinatie);
            back(portale[i].init,pasi+d1+portale[i].timp,trecutprin);
            for(long j=1; j<=3; j++)
                trecutprin[j]=backu[j];
        }
}
int main()
{
    FILE *q,*w;
    q=fopen("portal3.in","r");
    w=fopen("portal3.out","w");
    long k,n,m,t;
    fscanf(q,"%ld",&t);
    for(k=1; k<=t; k++)
    {
        fscanf(q,"%ld%ld",&n,&m);
        final.x=n;
        final.y=m;
        Punct p1,p2;
        for(long i=1; i<=3; i++)
        {
            long ttimp;
            fscanf(q,"%ld %ld %ld %ld %ld",&p1.x,&p1.y,&p2.x,&p2.y,&ttimp);
            Portal put;
            put.init=p1;
            put.Destinatie=p2;
            put.timp=ttimp;
            portale[i]=put;
        }

        Punct start;
        start.x=0;
        start.y=0;
        dmin=-1;
        long vid[4]= {false,false,false,false};
        back(start,0,vid);
        fprintf(w,"%ld\n",dmin);
    }
    return 0;
}