Cod sursa(job #433335)

Utilizator btamasyaBorsos Tamas btamasya Data 3 aprilie 2010 16:21:33
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<iostream.h>
#include<fstream.h>
int a[5][5];
int ap[60][60],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 lep)
{
	int i,j;
	oks=1;
	for (i=0;i<n+2;i++) for (j=0;j<m+2;j++) ap[i][j]=0;
	ap[b][c]=lep;
	k=lep;
	if ((b==x2)&&(c==y2)) oks=0;
	while ((oks==1)&&(k<min))
	{
		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 kerk (int i,int j,int lep,int k)
{
	int b,l,z;
	b=a[i][j];
	z=a[i][j];
	a[i][j]=0;
	l=k;
	while (b!=l)if (b>l) b=b-l;else l=l-b;
	k=k/l;
	if (k==1) lee (i,j,lep);
	else
	{
		if ((a[i+1][j]!=0)&&(a[i+1][j]!=-1))kerk (i+1,j,lep+1,k);       
		if ((a[i-1][j]!=0)&&(a[i-1][j]!=-1))kerk (i-1,j,lep+1,k);         
		if ((a[i][j+1]!=0)&&(a[i][j+1]!=-1))kerk (i,j+1,lep+1,k);        
		if ((a[i][j-1]!=0)&&(a[i][j-1]!=-1))kerk (i,j-1,lep+1,k);         
	}
	a[i][j]=z;
}
int main()
{
	int k,x1,y1,i,j;
	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];
	if (k==1) {lee(x1,y1,0);}
	else kerk(x1,y1,1,k);
	g<<min;
}