Cod sursa(job #636147)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 19 noiembrie 2011 17:25:01
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.73 kb
#include<fstream>
#include<cmath>
using namespace std;
int T,n,m,C[4],d[8][8],p[7],c[7],distmin,v[8];
struct Pozitie{int x,y;};
Pozitie P[7];
bool uz[8];

inline int Dist(int a,int b,int c,int d)
{
	return abs(a-c)+abs(b-d);
}

inline int Min(int a,int b)
{
	if(b<a)
		return b;
	return a;
}

inline void Prelucrare(int nr)
{
	int i,dist;
	dist=d[0][v[1]];
	for(i=1;i<nr;i++)
		dist+=min(min(Dist(P[v[i]].x,P[v[i]].y,P[v[i+1]].x,P[v[i+1]].y),Dist(P[v[i]].x,P[v[i]].y,P[p[v[i+1]]].x,P[p[v[i+1]]].y)+C[c[v[i+1]]]),min(Dist(P[p[v[i]]].x,P[p[v[i]]].y,P[v[i+1]].x,P[v[i+1]].y)+C[c[v[i]]],Dist(P[p[v[i]]].x,P[p[v[i]]].y,P[p[v[i+1]]].x,P[p[v[i+1]]].y)+C[c[v[i]]]+C[c[v[i+1]]]));
	dist+=d[v[nr]][7];
	distmin=min(dist,distmin);
}

inline void Back(int k)
{
	if(k!=1)
		Prelucrare(k-1);
	if(k<3)
	{
		short i;
		for(i=1;i<7;i++)
		{
			if(!uz[i])
			{
				v[k]=i;
				uz[i]=true;
				Back(k+1);
				uz[i]=false;
			}
		}
	}
}

inline void Rezolvare()
{
	short i;
	d[0][7]=d[7][0]=Dist(0,0,n,m);
	for(i=1;i<7;i++)
	{
		d[0][i]=d[i][0]=Dist(0,0,P[i].x,P[i].y);
		d[i][7]=d[7][i]=Dist(P[i].x,P[i].y,n,m);
	}
	for(i=1;i<7;i++)
	{
		d[0][i]=d[i][0]=Min(d[0][i],d[0][p[i]]+C[c[i]]);
		d[7][i]=d[i][7]=Min(d[7][i],d[7][p[i]]+C[c[i]]);
	}
	distmin=d[0][7];
	Back(1);
}

int main()
{
	int t;
	ifstream fin("portal3.in");
	ofstream fout("portal3.out");
	fin>>T;
	p[1]=2; p[2]=1; c[1]=c[2]=1;
	p[3]=4; p[4]=3; c[3]=c[4]=2;
	p[5]=6; p[6]=5; c[5]=c[6]=3;
	for(t=0;t<T;t++)
	{
		fin>>n>>m;
		fin>>P[1].x>>P[1].y>>P[2].x>>P[2].y>>C[1];
		fin>>P[3].x>>P[3].y>>P[4].x>>P[4].y>>C[2];
		fin>>P[5].x>>P[5].y>>P[6].x>>P[6].y>>C[3];
		Rezolvare();
		fout<<distmin<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}