Cod sursa(job #635613)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 19 noiembrie 2011 13:31:41
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.78 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int T,N,M,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,c;
long long D[10][10],Dmin[10];
int v[10],cd[100];

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

void BFS() {
	int i,pi,ps,p;
	pi=ps=1;
	cd[pi]=0;
	for(i=1;i<8;i++) { v[i]=0; Dmin[i]=2000000005; }
	v[0]=1; Dmin[0]=0;
	
	while(ps<=pi) {
		p=cd[ps];
		for(i=0;i<8;i++)
			if(Dmin[p]+D[p][i]<Dmin[i]) {
				Dmin[i]=Dmin[p]+D[p][i];
				if(!v[i] && i!=7) {
					cd[++pi]=i;
					v[i]=1;
				}
			}
		v[p]=0;
		ps++;
	}
}

int main() {
	freopen("portal3.in","r",stdin);
	freopen("portal3.out","w",stdout);
	
	// 0 - start
	// 7 - finish
	
	for(scanf("%d",&T);T;T--) {
		scanf("%d %d",&N,&M);
		
		D[0][7]=N+M;
		
		scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&c);
		D[0][1]=D[1][0]=x1+y1; D[0][2]=D[2][0]=x2+y2;
		D[1][7]=dist(x1,y1,N,M); D[2][7]=dist(x2,y2,N,M);
		D[1][2]=D[2][1]=c;
		
		scanf("%d %d %d %d %d",&x3,&y3,&x4,&y4,&c);
		D[0][3]=D[3][0]=x3+y3; D[0][4]=D[4][0]=x4+y4;
		D[3][7]=dist(x3,y3,N,M); D[4][7]=dist(x4,y4,N,M);
		D[3][4]=D[4][3]=c;
		
		scanf("%d %d %d %d %d",&x5,&y5,&x6,&y6,&c);
		D[0][5]=D[5][0]=x5+y5; D[0][6]=D[6][0]=x6+y6;
		D[5][7]=dist(x5,y5,N,M); D[6][7]=dist(x6,y6,N,M);
		D[5][6]=D[6][5]=c;
		
		D[1][3]=D[3][1]=dist(x1,y1,x3,y3);
		D[1][4]=D[4][1]=dist(x1,y1,x4,y4);
		D[1][5]=D[5][1]=dist(x1,y1,x5,y5);
		D[1][6]=D[6][1]=dist(x1,y1,x6,y6);
		D[2][3]=D[3][2]=dist(x2,y2,x3,y3);
		D[2][4]=D[4][2]=dist(x2,y2,x4,y4);
		D[2][5]=D[5][2]=dist(x2,y2,x5,y5);
		D[2][6]=D[6][2]=dist(x2,y2,x6,y6);
		D[3][5]=D[5][3]=dist(x3,y3,x5,y5);
		D[3][6]=D[6][3]=dist(x3,y3,x6,y6);
		D[4][5]=D[5][4]=dist(x4,y4,x5,y5);
		D[4][6]=D[6][4]=dist(x4,y4,x6,y6);
		
		BFS();
		printf("%d\n",Dmin[7]);
	}
}