Cod sursa(job #5366)

Utilizator dzsDonca Zsolt dzs Data 12 ianuarie 2007 01:03:38
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.08 kb
// Barbar.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
//#include <conio.h>
#pragma warning(disable : 4996)

#define INFINITE 999999999
#define SIZE 1010
#define VECTORSIZE SIZE*SIZE*4

int r, c, sx, sy, ex, ey;

char map[SIZE][SIZE];

long leeDD[SIZE][SIZE];
bool passed[SIZE][SIZE];

struct
{
	long x, y, dd;
} lv[VECTORSIZE];
long ap = 0, le = 0;

int main(int argc, char* argv[])
{
	int i, j;
	FILE *f = fopen("barbar.in", "r");
	fscanf(f, "%d %d\n", &r, &c);
	for(i=0;i<=c+1;i++)
	{
		map[0][i] = '*';
		map[r+1][i] = '*';
	};
	for(i=1;i<=r;i++)
	{
		map[i][0] = '*';
		fgets(&map[i][1], SIZE-2, f);
		map[i][c+1] = '*';
		for(j=1;j<=c;j++)
		{
			leeDD[i][j] = INFINITE;
			switch(map[i][j])
			{
			case 'I': sx = j; sy = i; map[i][j] = '.'; leeDD[i][j] = INFINITE+1; break;
			case 'O': ex = j; ey = i; map[i][j] = '.'; leeDD[i][j] = INFINITE+1; break;
			case 'D': lv[le].x = j; lv[le].y = i; lv[le].dd = 0; le++; leeDD[i][j] = 0; map[i][j] = '*'; break;
			}
		}
	}
	fclose(f);

	long dx, dy;

	for(ap = 0; ap < le; ap++)
	{
		dx = lv[ap].x;
		dy = lv[ap].y;
		
		leeDD[dy][dx] = lv[ap].dd;

		dx = lv[ap].x - 1;
		dy = lv[ap].y;
		if (map[dy][dx] != '*')
		{
			if (leeDD[dy][dx] > lv[ap].dd+1)
			{
				lv[le].x = dx;
				lv[le].y = dy;
				lv[le].dd = lv[ap].dd + 1;
				le++;
			}
		};
		/*******************************************/
		dx = lv[ap].x + 1;
		dy = lv[ap].y;
		if (map[dy][dx] != '*')
		{
			if (leeDD[dy][dx] > lv[ap].dd+1)
			{
				lv[le].x = dx;
				lv[le].y = dy;
				lv[le].dd = lv[ap].dd + 1;
				le++;
			}
		};
		/*******************************************/
		dx = lv[ap].x;
		dy = lv[ap].y - 1;
		if (map[dy][dx] != '*')
		{
			if (leeDD[dy][dx] > lv[ap].dd+1)
			{
				lv[le].x = dx;
				lv[le].y = dy;
				lv[le].dd = lv[ap].dd + 1;
				le++;
			}
		};
		/*******************************************/
		dx = lv[ap].x;
		dy = lv[ap].y + 1;
		if (map[dy][dx] != '*')
		{
			if (leeDD[dy][dx] > lv[ap].dd+1)
			{
				lv[le].x = dx;
				lv[le].y = dy;
				lv[le].dd = lv[ap].dd + 1;
				le++;
			}
		};
		/*******************************************/
	}

	long stx, sty, enx, eny;
	if (leeDD[ey][ex] < leeDD[sy][sx])
	{
		stx = ex;
		sty = ey;
		enx = sx;
		eny = sy;
	} else {
		stx = sx;
		sty = sy;
		enx = ex;
		eny = ey;
	};

	passed[sty][stx] = false;
	while(leeDD[sty][stx] > 0 && !passed[sty][stx])
	{
		le = 0;
		lv[le].x = stx;
		lv[le].y = sty;
		lv[le].dd = leeDD[sty][stx];
		le++;

		for(i=0;i<=r+1;i++)
			for(j=0;j<=c+1;j++)
				passed[i][j] = false;

		for(ap = 0; ap < le && !passed[eny][enx]; ap++)
		{

			long dd;

			dx = lv[ap].x - 1;
			dy = lv[ap].y;
			dd = lv[ap].dd;
			if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
			{
				lv[le].x = dx;
				lv[le].y = dy;
				leeDD[dy][dx] = dd;
				passed[dy][dx] = true;
				le++;
			};
			/**************************************/
			dx = lv[ap].x + 1;
			dy = lv[ap].y;
			dd = lv[ap].dd;
			if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
			{
				lv[le].x = dx;
				lv[le].y = dy;
				leeDD[dy][dx] = dd;
				passed[dy][dx] = true;
				le++;
			};
			/**************************************/
			dx = lv[ap].x;
			dy = lv[ap].y - 1;
			dd = lv[ap].dd;
			if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
			{
				lv[le].x = dx;
				lv[le].y = dy;
				leeDD[dy][dx] = dd;
				passed[dy][dx] = true;
				le++;
			};
			/**************************************/
			dx = lv[ap].x;
			dy = lv[ap].y + 1;
			dd = lv[ap].dd;
			if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
			{
				lv[le].x = dx;
				lv[le].y = dy;
				leeDD[dy][dx] = dd;
				passed[dy][dx] = true;
				le++;
			};
			/**************************************/
		};
		leeDD[sty][stx]--;
	};
	leeDD[sty][stx]++;

	long ntw;
	if (passed[eny][enx])
	{
		ntw = leeDD[eny][enx];
	} else {
		ntw = -1;
	}
	
	f = fopen("barbar.out","w");
	fprintf(f, "%ld", ntw);
	fclose(f);

	return 0;
}