Cod sursa(job #433184)

Utilizator btamasyaBorsos Tamas btamasya Data 3 aprilie 2010 14:09:15
Problema Kdrum Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<iostream.h>
#include<fstream.h>
int ak[54][54],as[54][54]={0},a[54][54],ap[54][54],lep=1,n,m,x2,y2,min=20000,oks=1,k;
void nezz2 (int i,int j)
{
	if ((a[i][j]!=0)&&(a[i][j]!=-1)&&(ap[i][j]==0))
	{
		ap[i][j]=k+1;
		if ((i==x2)&&(j==y2)) oks=0;
	}
}
void lee (int b, int c)
{
	int i,j;
	for (i=0;i<n+2;i++)
		for (j=0;j<m+2;j++)
			ap[i][j]=0;
	ap[b][c]=lep+1;
	k=lep+1;
	if ((b==x2)&&(c==y2)) oks=0;
	while (oks==1)
	{
		for (i=1;(i<=n)&&(oks==1);i++)
			for (j=1;(j<=m)&&(oks==1);j++)
				if (ap[i][j]==k)
				{
					if (oks==1)nezz2(i+1,j);
					if (oks==1)nezz2(i-1,j);
					if (oks==1)nezz2(i,j+1);
					if (oks==1)nezz2(i,j-1);
				}
		k++;
	}
	if (k<min) min=k;
}
void nezz (int c, int b,int i,int j)
{
	int k,l;
	if ((a[i][j]!=0)&&(a[i][j]!=-1))
	{
		k=ak[c][b];
		b=a[i][j];
		l=k;
		while (b!=l)
		{
			if (b>l) b=b-l;
			else l=l-b;
		}
		k=k/l;
		if ((k<ak[i][j])&&(ak[i][j]!=20234)){ak[i][j]=k;as[i][j]=lep+1;}
		if (ak[i][j]==1) {lee(i,j);ak[i][j]=20234;}
	}
}
void kerk ()
{
	int i,j;
	while (lep<min)
	{
	for (i=1;(i<=n);i++)
		for (j=1;(j<=m);j++)
			if (as[i][j]==lep)
			{
				nezz (i,j,i+1,j);
				nezz (i,j,i-1,j);
				nezz (i,j,i,j+1);
				nezz (i,j,i,j-1);
			}
	lep++;
	}
}
int main()
{
	int k,x1,y1,i,j,b,l;
	fstream f,g;
	f.open ("kdrum.in",ios::in);
	g.open ("kdrum.out",ios::out);
	f>>n>>m>>k;
	f>>x1>>y1>>x2>>y2;
	for (i=0;i<=n+1;i++)
		for (j=0;j<=m+1;j++)
			a[i][j]=-1;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			f>>a[i][j];
	for (i=0;i<n+2;i++)
		for (j=0;j<m+2;j++)
			ak[i][j]=12200;
	as[x1][y1]=1;
	b=a[x1][y1];
	l=k;
	while (l!=b)
	{
		if (l>b) l=l-b;
		else b=b-l;
	}
	k=k/l;
	ak[x1][y1]=k;
	if (ak[x1][y1]==1) {lee(x1,y1);min--;}
	else kerk();
	g<<min;
}