Cod sursa(job #214391)

Utilizator Kid0Shizzle Nizzle Kid0 Data 14 octombrie 2008 00:30:58
Problema Gropi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
// Gropi.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include "fstream"
#include "iostream"

using namespace std;

int main(void)
{
	fstream in, out;

	in.open("gropi.in", ios_base::in);
	if(!in.is_open())
	{
		cout << "Eroare la deschiderea fisierului de intrare!";
		return 1;
	}

	out.open("gropi.out", ios_base::out);
	if(!out.is_open())
	{
		cout << "Eroare la deschiderea fisierului de iesire!";
		return 1;
	}

	int N, C, M, i;
	bool **oras;	// harta oras
	int x, y;

	in >> C >> N;	// citire date de intrare

	oras = new bool*[2];
	oras[0] = new bool[C];
	oras[1] = new bool[C];

	for(i = 0; i < N; i++)
	{
		in >> x >> y;		// citire coordonate gropi
		//cout << x << " " << y << endl;

		oras[x - 1][y - 1] = true;
	}

	in >> M;	// nr. teste
	int x1, y1, x2, y2;
	int nrPasi, directie;

	for(i = 0; i < M; i++)
	{
		in >> x1 >> y1 >> x2 >> y2;		// citire coordonate initiale si finale
		x1--; x2--;
		y1--; y2--;

		//cout << x1 << " " << y1 << " " << x2 << " " << y2 << endl;

		nrPasi = 0;

		while(x1 != x2 || y1 != y2)
		{
			//cout << x1 << " " << y1 << endl;

			if((y2 - y1) > 0)			// afla directia de parcurgere
				directie = 1;
			else
				if((y2 - y1) == 0)
					directie = 0;
				else
					directie = -1;

			//cout << "Directie: " << directie << endl;

			if(oras[x1][y1 + directie] == true)		// daca avem groap in fata schimbam linia
				x1 = (x1 + 1) % 2;
			else
			{
				if(y1 == y2)				// daca nu avem groapa dar suntem pe coloana finala dar nu si pe linia finala, schimbam linia
					x1 = (x1 + 1) % 2;

				y1 += directie;			// parcurgere o unitate inspre pozitia finala
			}

			nrPasi++;
		}

		//cout << "Nr. pasi: " << nrPasi + 1 << endl;
		out << nrPasi + 1 << endl;
	}

	in.close();
	out.close();
	//system("PAUSE");

	return 0;
}