Cod sursa(job #636225)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 19 noiembrie 2011 17:50:44
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 2.01 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int T,N,M;

struct portal{
	int x1,y1,x2,y2;
	int c,c1,c2;
} p[4];

int sol;

inline int dist(const int & x1,const int & y1,const int & x2,const int & y2){
		return(abs(x2-x1) + abs(y2-y1));

}
int main(){
	
	freopen("portal3.in","r",stdin);
	freopen("portal3.out","w",stdout);
	
	for(scanf("%d",&T);T;--T){
		
		scanf("%d%d",&N,&M);
		
		for(int i=1;i<=3;++i)
			scanf("%d%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2,&p[i].c);
		
		//costul de a ajunge la fiecare portal
		for(int i=1;i<=3;++i){
			p[i].c1=p[i].x1+p[i].y1;
			p[i].c2=p[i].x2+p[i].y2;
		}
		
		//minimizam costul de a ajunge la fiecare portal
		bool ok=0;		
		do {
			ok=0;
			for(int i=1;i<=3;++i){
				
				//ne miscam intre Pi
				if(p[i].c1 > p[i].c2+p[i].c){
					p[i].c1= p[i].c2+p[i].c;
					ok=1;
				}
				
				if(p[i].c2 > p[i].c1+p[i].c){
					p[i].c2 = p[i].c1+p[i].c;
					ok=1;
				}
			}

			for(int i=1;i<=3;++i)
				for(int j=1;j<=3;++j){
					
					//ajungem in portalul j din portalul i
					if(j!=i){
						
						if(p[j].c1 > p[i].c1 + dist(p[j].x1,p[j].y1,p[i].x1,p[i].y1) ){
							p[j].c1 = p[i].c1 + dist(p[j].x1,p[j].y1,p[i].x1,p[i].y1);							
							ok=1;
						}
						
						if(p[j].c1 > p[i].c2 + dist(p[j].x1,p[j].y1,p[i].x2,p[i].y2) ){
							p[j].c1 = p[i].c2 + dist(p[j].x1,p[j].y1,p[i].x2,p[i].y2);							
							ok=1;
						}
						
						if(p[j].c2 > p[i].c1 + dist(p[j].x2,p[j].y2,p[i].x1,p[i].y1) ){
							p[j].c2 = p[i].c1 + dist(p[j].x2,p[j].y2,p[i].x1,p[i].y1);							
							ok=1;
						}
						if(p[j].c2 > p[i].c2 + dist(p[j].x2,p[j].y2,p[i].x2,p[i].y2) ){
							p[j].c2 = p[i].c2 + dist(p[j].x2,p[j].y2,p[i].x2,p[i].y2);							
							ok=1;
						}
						
					}
					
				}
		} while(ok);
			
		sol=M+N;
		
		for(int i=1;i<=3;++i){
			sol=min(sol,(N-p[i].x1+M-p[i].y1 + p[i].c1));
			sol=min(sol,(N-p[i].x2+M-p[i].y2 + p[i].c2));
		}
		
		printf("%d",sol);
	}
	
	
	
return 0;	
}