Cod sursa(job #465582)

Utilizator SmarandaMaria Pandele Smaranda Data 24 iunie 2010 19:56:54
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
long a[51][51];
long l[51][51];
long r[51][51];
long dx[]={0,-1,0,1,0};
long dy[]={0,0,1,0,-1};
struct KDRUM
{
	long x,y;
};
KDRUM q[100001];
int main()
{
	long i,j,n,m,k,x1,x2,y1,y2,p,u,xn,yn,rest;
	
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	
	scanf("%ld%ld%ld%ld%ld%ld%ld",&n,&m,&k,&x1,&y1,&x2,&y2);
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			{
				scanf("%ld",&a[i][j]);
				l[i][j]=2000000000;
				r[i][j]=-100000;
			}
	p=u=1;
	q[1].x=x1;
	q[1].y=y1;
	l[x1][y1]=1;
	r[x1][y1]=a[x1][y1]%k;
	while (p<=u)
	{
		for (i=1;i<=4;i++)
		{
			xn=q[p].x+dx[i];
			yn=q[p].y+dy[i];
			rest=(r[  q[p]. x  ]  [  q[p].y ]*a[xn][yn])%k;
			if (rest>r[xn][yn])
			{
				r[xn][yn]=rest;
				l[xn][yn]=l  [q[p].x][q[p].y]+1;
				q[++u].x=xn;
				q[u].y=yn;
			}
			if (rest==r[xn][yn])
			{
				if (l[q[p].x][q[p].y]+1<l[xn][yn])
				{
					r[xn][yn]=rest;
					l[xn][yn]=l  [q[p].x][q[p].y]+1;
					q[++u].x=xn;
					q[u].y=yn;	
				}
			}
		}
	p++;		
	}
	printf("%ld\n",l[x2][y2]);
	return 0;
}