Cod sursa(job #637729)

Utilizator cosminx2003Cosmin Clapon cosminx2003 Data 20 noiembrie 2011 16:06:26
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 2.66 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#define D_MAX 7
#define P 4
using namespace std;

ifstream f("portal3.in");
ofstream g("portal3.out");

typedef struct {
	int x,y;
} point;
typedef struct {
	int c;
	point g[2];
} portal;

inline int go_further(int i,int j) {
	return (i%2)?((j!=i&&j!=i+1)?1:0):((j!=i&&j!=i-1)?1:0);
}

inline long long dist(point a,point b) {
	cout<<"Distanta dintre ("<<a.x<<","<<a.y<<") si ("<<b.x<<","<<b.y<<")"<<" = "<<abs(a.x-b.x)+abs(a.y-b.y)<<endl;
	return abs(a.x-b.x)+abs(a.y-b.y);
}

inline int fn(int i) {
	if(i==5) {
		return 2;
	} else {
		return (i/3);
	}
}
int main() {
	int n,m,t,i,j,k,nr,zero=0;
	long long min,curr;
	portal p[P];
	point init,fin;
	init.x=0, init.y=0;
	
	f>>t;
	while(t--) {
		f>>n>>m;
		for(i=0;i<=2;i++) {
			f>>p[i].g[0].x>>p[i].g[0].y>>p[i].g[1].x>>p[i].g[1].y>>p[i].c;
		}
		fin.x=n, fin.y=m;
		min=999999999;
		for(i=1;i<=7;i++) {
			curr=0;
			if(i != 7) {
				cout<<"DA "<<i<<endl;
				curr=dist(init,p[fn(i)].g[i%2])+p[fn(i)].c;
				cout<<curr<<endl;
				if(curr < min) {
					for(j=1;j<=7;j++) {
						if(j != 7) {
							if(go_further(i,j)) {
											cout<<"DA "<<j<<endl;
								curr+=dist(p[fn(i)].g[(i%2)^1],p[fn(j)].g[j%2])+p[fn(j)].c;
								cout<<curr<<endl;
								if(curr < min) {
									//cout<<"MIN";
									for(k=1;k<=7;k++) {
										if(k != 7) {
											if(go_further(k,j) && go_further(k,i)) {
															cout<<"DA "<<k<<endl;
												curr+=dist(p[fn(j)].g[(j%2)^1],p[fn(k)].g[k%2])+p[fn(k)].c;
												cout<<curr<<endl;
												if(curr < min) {
													curr+=dist(p[fn(k)].g[(k%2)^1],fin);
													if(curr < min) {
														min=curr;
														cout<<"MIN = "<<curr<<" "<<i<<" "<<j<<" "<<k<<endl;
													}
													curr-=dist(p[fn(k)].g[(k%2)^1],fin);
												}
												curr-=dist(p[fn(j)].g[(j%2)^1],p[fn(k)].g[k%2])+p[fn(k)].c;
											}
										} else {
											curr+=dist(p[fn(j)].g[(j%2)^1],fin);
											if(curr < min) {
												min=curr;
												cout<<"MIN = "<<curr<<" "<<i<<" "<<j<<" "<<k<<endl;
											}
											curr-=dist(p[fn(j)].g[(j%2)^1],fin);
											break;
										}
									}
								}
								curr-=dist(p[fn(i)].g[(i%2)^1],p[fn(j)].g[j%2])+p[fn(j)].c;
							}
						} else {
							curr+=dist(p[fn(i)].g[i%2],fin);
							if(curr < min) {
								min=curr;
																						cout<<"MIN = "<<curr<<" "<<i<<" "<<j<<" "<<k<<endl;
							}
							curr-=dist(p[fn(i)].g[i%2],fin);
							break;
						}
					}
				}
			} else {
				curr=dist(init,fin);
				if(curr < min) {
					min=curr;
																			cout<<"MIN = "<<curr<<" "<<i<<" "<<j<<" "<<k<<endl;
				}
			}
		}
		g<<min;
	}
	return 0;
}