Cod sursa(job #636192)

Utilizator alexa42alex androne alexa42 Data 19 noiembrie 2011 17:39:55
Problema Portal3 Scor 0
Compilator c Status done
Runda .com 2011 Marime 1.77 kb
#include <stdio.h>
#include <stdlib.h>

#define IN_PATH "portal3.in"
#define OUT_PATH "portal3.out"
#define SIZE 1000000000

int read_input (long int *T, long int *M, long int *N, long int *X, long int *Y, long int *C) {
	int i;
	FILE *file;
	file = fopen(IN_PATH, "r+");
	if (fscanf(file, "%ld", T)<=0)
		return -1;
	if (fscanf(file, "%ld", M)<=0)
		return -1;
	if (fscanf(file, "%ld", N)<=0)
		return -1;
	for(i=0;i<3;i++) {
		fscanf(file, "%ld", &X[i*2]);
		fscanf(file, "%ld", &Y[i*2]);
		fscanf(file, "%ld", &X[i*2+1]);
		fscanf(file, "%ld", &Y[i*2+1]);
		fscanf(file, "%ld", &C[i]);
	}
	fclose(file);
	return 0;
}

int write_output (long int solution) {
	FILE *file;
	file = fopen(OUT_PATH, "a+");
	fprintf(file, "%ld ", solution);
	fclose(file);
	return 0;
}

int compute_time (int X1, int Y1, int X2, int Y2) {
	long int time = 0;
	time = (X1<X2)?(X2-X1):(X1-X2);
	time += (Y1<Y2)?(Y2-Y1):(Y1-Y2);
	return time;
}

void portal3() {
	long int T, M, N;
	long int *X, *Y, *C;
	X = (long int*)malloc(6*sizeof(long int));
	Y = (long int*)malloc(6*sizeof(long int));
	C = (long int*)malloc(3*sizeof(long int));
	long int i, time, min_time, index, total_time = 0, cX=0, cY=0;

	while(T>0) {
		if(read_input (&T, &M, &N, X, Y, C)<0)
			return;

		while (cX<M && cY<N) {
			min_time = compute_time(cX,cY,M,N);
			index = -1;
			for(i=0;i<3;i++) {
				if(X[i]>=0) {
					time = compute_time(cX,cY,X[i*2],Y[i*2]);
					if(time<min_time) {
						min_time = time;
						index = i*2;
					}
				}
			}
			total_time += min_time;
			if(index>=0) {
				total_time += C[index/2];
				cX = X[index+1];
				cY = Y[index+1];
				X[index] = Y[index] = C[index] = -1;
			}
			else {
				cX = M;
				cY = N;
			}
		}
		write_output(total_time);
		T--;
	}
	free(X);
	free(Y);
	free(C);
}

int main () {
	portal3();
	return 0;
}