Pagini recente » Cod sursa (job #577798) | Cod sursa (job #1770490) | Cod sursa (job #1602615) | Cod sursa (job #1018144) | Cod sursa (job #637739)
Cod sursa(job #637739)
#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) {
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;
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=0xFFFFFFFF;
for(i=1;i<=7;i++) {
curr=0;
if(i != 7) {
curr=dist(init,p[fn(i)].g[i%2])+p[fn(i)].c;
if(curr < min) {
for(j=1;j<=7;j++) {
if(j != 7) {
if(go_further(i,j)) {
curr+=dist(p[fn(i)].g[(i%2)^1],p[fn(j)].g[j%2])+p[fn(j)].c;
if(curr < min) {
for(k=1;k<=7;k++) {
if(k != 7) {
if(go_further(k,j) && go_further(k,i)) {
curr+=dist(p[fn(j)].g[(j%2)^1],p[fn(k)].g[k%2])+p[fn(k)].c;
if(curr < min) {
curr+=dist(p[fn(k)].g[(k%2)^1],fin);
if(curr < min) {
min=curr;
}
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;
}
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;
}
curr-=dist(p[fn(i)].g[i%2],fin);
break;
}
}
}
} else {
curr=dist(init,fin);
if(curr < min) {
min=curr;
}
}
}
g<<min<<"\n";
}
return 0;
}