Cod sursa(job #638138)

Utilizator otilia_sOtilia Stretcu otilia_s Data 20 noiembrie 2011 19:07:19
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.81 kb
#include <fstream>
#include <stdlib.h>
#define oo 2000000099
using namespace std;

typedef struct Portal {
						//struct Poarta {int x, y;} p[2];
						int p1x,p1y,p2x,p2y;
					   } Portal;
Portal p[5];

 long long cost[4][3][4];
 int c[4],n,m;

inline int min(int a, int b)
{
	return a<b?a:b;
}

int dist(int x1, int y1, int x2, int y2)
{
	return abs(x1-x2)+abs(y1-y2);
}

long long rez()
{
	int i,fol,ant;
	//c[p][dir][fol] ->  dir ==0 directia p0->p1,  dir==1 directia p1->p0
	for (i=0;i<3;++i)
	{
		cost[i][0][0]=c[i]+p[i].p1x+p[i].p1y;
		cost[i][1][0]=c[i]+p[i].p2x+p[i].p2y;
	}
	
	for (fol=1;fol<3;++fol) //cate folosite
	  for (i=0;i<3;++i)
	  {
		cost[i][0][fol]=cost[i][1][fol]=oo;
		for (ant=0;ant<3;++ant)
		  if (ant!=i)
			{
				cost[i][0][fol]=min(cost[i][0][fol],c[i]+min(
														cost[ant][0][fol-1]+dist(p[ant].p2x,p[ant].p2y,p[i].p1x,p[i].p1y),
														cost[ant][1][fol-1]+dist(p[ant].p1x,p[ant].p1y,p[i].p1x,p[i].p1y)
														));
				if (cost[i][0][fol]>oo) cost[i][0][fol]=oo;
				cost[i][1][fol]=min(cost[i][1][fol],c[i]+min(
														cost[ant][0][fol-1]+dist(p[ant].p2x,p[ant].p2y,p[i].p2x,p[i].p2y),
														cost[ant][1][fol-1]+dist(p[ant].p1x,p[ant].p1y,p[i].p2x,p[i].p2y)
														));
				if (cost[i][1][fol]>oo) cost[i][0][fol]=oo;
			}
	  }
	long long sol=n+m;
	for (fol=0;fol<3;++fol)
		for (i=0;i<3;++i)
		{
			sol=min(sol, min(
							cost[i][0][fol]+ dist(p[i].p2x,p[i].p2y,n,m),
							cost[i][1][fol]+ dist(p[i].p1x,p[i].p1y,n,m)
							));
		}
	return sol;
}

int main()
{
	ifstream fin("portal3.in");
	ofstream fout("portal3.out");
	
	int T,i;
	fin>>T;
	while (T--)
	{
		fin>>n>>m;
		for (i=0;i<3;++i)
		{
			fin>>p[i].p1x>>p[i].p1y>>p[i].p2x>>p[i].p2y>>c[i];
		}
		fout<<rez()<<"\n";
	}
	
return 0;	
}