Cod sursa(job #254423)

Utilizator lamez0rBogdan Bondor lamez0r Data 7 februarie 2009 12:03:59
Problema Kdrum Scor 0
Compilator c Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.33 kb
#include<stdio.h>
int n,m,k,x1,y1,x2,y2;
long a[52][52],b[52][52];

void read ()
	{
	FILE *f=fopen("kdrum.in","r");
	fscanf(f,"%d%d%d",&n,&m,&k);
	fscanf(f,"%d%d%d%d",&x1,&y1,&x2,&y2);
	int i,j;
	for (i=1;i<=n;++i)
		for (j=1;j<=m;++j)
			{
			fscanf(f,"%ld",&a[i][j]);
			if (a[i][j]==0)
				b[i][j]=20000000;
			}
	fclose(f);
	}

void solve ()
	{
	int i,j,poz=1;
	b[x1][y1]=1;
	for (i=y1+1;i<=y2 && a[x1][i]; i++)
		b[x1][i]=++poz;
	poz=1;
	for (i=x1+1;i<=x2 && a[y1][i]; i++)
		b[i][y1]=++poz;
	for (i=x1+1;i<=x2;++i)
		{
		for (j=y1;j<=y2;++j)
			if (!b[i][j])
				{
				long min=20000001;
				if (b[i-1][j]<min&&i-1>=1)
					min=b[i-1][j];
				if (b[i][j-1]<min&&j-1>=1)
					min=b[i][j-1];
				if (!b[i-1][j] && !b[i][j-1])
					b[i][j]=0;
				else
					b[i][j]=min+1;
				}
		}
	if (!b[x2][y2])
		for (i=x1;i<=x2;++i)
			for (j=y1;j<=y2;++j)
				if (!b[i][j])
					{
					int min=20000001;
					if (b[i-1][j]<min&&i-1>=1)
						min=b[i-1][j];
					if (b[i][j-1]<min&&j-1>=1)
						min=b[i][j-1];
					if (b[i][j+1]<min&&j+1<=n)
						min=b[i][j+1];
					if (b[i+1][j]<min&&i+1<=n)
						min=b[i+1][j];
					b[i][j]=min+1;
					}
	}

void write ()
	{
	FILE *f=fopen("kdrum.out","w");
	fprintf(f,"%ld",b[x2][y2]);
	fclose(f);
	}

int main ()
{
read ();
solve ();
write ();
return 0;
}