Cod sursa(job #637769)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 20 noiembrie 2011 16:34:53
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.63 kb
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>

using namespace std;

inline int abs(int x){if (x>0) return x;else return -x;}
int d[10],u[10],rx[10],ry[10];
struct str{int x,y;};
inline str mp(int x,int y){str aux;aux.x=x;aux.y=y;return aux;}
struct cmp_str{bool operator()(str x,str y){return x.y>y.y;};};
priority_queue <str,vector <str>,cmp_str> q;
vector <str> g[10];

int main()
{
    int t,n,m,i,j,c;
    vector <str>::iterator it;
    str aux;
    freopen("portal3.in","r",stdin);
    freopen("portal3.out","w",stdout);
    scanf("%d",&t);
    for (;t;--t)
    {
        scanf("%d%d",&n,&m);
        rx[2]=n;
        ry[2]=m;
        for (i=1;i<=3;++i)
        {
            scanf("%d%d%d%d%d",&rx[2*i+1],&ry[2*i+1],&rx[2*i+2],&ry[2*i+2],&c);
            g[2*i+1].push_back(mp(2*i+2,c));
            g[2*i+2].push_back(mp(2*i+1,c));
        }
        for (i=1;i<=8;++i)
            for (j=1;j<=8;++j)
            {
                g[i].push_back(mp(j,abs(rx[i]-rx[j])+abs(ry[i]-ry[j])));
                g[i].push_back(mp(j,abs(rx[i]-rx[j])+abs(ry[i]-ry[j])));
            }
        q.push(mp(1,0));
        while (q.top().x!=2)
        {
            aux=q.top();
            q.pop();
            if (u[aux.x])
                continue;
            u[aux.x]=1;
            for (it=g[aux.x].begin();it!=g[aux.x].end();++it)
                if (!u[it->x])
                    q.push(mp(it->x,(it->y)+aux.y));
        }
        printf("%d\n",q.top().y);
        while (!q.empty())
            q.pop();
        for (i=1;i<=8;++i)
            g[i].clear();
    }
    return 0;
}