/*********************
Biblioteka uždaviniui 'zadintuvas'

Kodavimas: UTF-8

Vertinimo metu bus naudojama kita biblioteka.
**********************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "zadintuvas_bib.h"

#define MAXN 210
#define MAXCALL 10
#define INFILE "zadintuvas.in", "r"
#define OUTFILE "zadintuvas.out", "w"

int _N, _M; // kambario aukštis ir plotis
char _room[MAXN][MAXN]; // kambario išdėstymas
FILE *_out; // rezultatų failas
int _clock_e, _clock_s; // žadintuvo padėtis
int _cnt = 0; // atstumas() iškvietimų kiekis
int _ready = 0; // ar nuskaityti duomenys

void _error(const char *err, int code) {
	fprintf(_out, "BLOGAI: %s\n", err);
	fclose(_out);
	exit(code);
}

void _read() {
	FILE *in;
	int i;
	
	if (_ready)
		return;
	in = fopen(INFILE);
	fscanf(in, "%d%d", &_N, &_M);
	fscanf(in, "%d%d", &_clock_e, &_clock_s);
	for (i = 0; i < _N; ++i)
		fscanf(in, " %s", _room[i]);
	fclose(in);
	_out = fopen(OUTFILE);
	_ready = 1;
	if (_clock_e < 1 || _clock_e > _N || _clock_s < 1 || _clock_s > _M)
		_error("Žadintuvas už kambario ribų", -1);
	if (!yraBaldas(_clock_e, _clock_s))
		_error("Žadintuvas ne po baldu", -1);
}

int gautiN() {
	if (!_ready)
		_read();
	return _N;
}

int gautiM() {
	if (!_ready)
		_read();
	return _M;
}

int yraBaldas(int e, int s) {
	if (!_ready)
		_read();
	if (e < 1 || e > _N || s < 1 || s > _M)
		_error("Tikrinama už kambario ribų", 0);
	return _room[e-1][s-1] == '#';
}

int atstumas(int e, int s) {
	int r;
	fprintf(_out, "> atstumas(%d, %d)\n", e, s);
	if (!_ready)
		_read();
	if (_cnt >= MAXCALL)
		_error("Per daug kartų kviečiama funkcija atstumas()", 0);
	++_cnt;
	if (e < 1 || e > _N || s < 1 || s > _M)
		_error("Koordinatės už kambario ribų", 0);
	if (yraBaldas(e, s))
		_error("Bandoma tikrinti po baldu", 0);
	r = abs(_clock_e - e) + abs(_clock_s - s);
	fprintf(_out, "< %d\n", r);
	return r;
}

void zadintuvas(int e, int s) {
	fprintf(_out, "> zadintuvas(%d, %d)\n", e, s);
	if (!_ready)
		_read();
	if (e < 1 || e > _N || s < 1 || s > _M)
		_error("Koordinatės už kambario ribų", 0);
	if (e != _clock_e || s != _clock_s)
		_error("Atsakymas neteisingas", 0);
	fprintf(_out, "GERAI\n");
	fclose(_out);
	exit(0);
}
