Cod sursa(job #274804)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 9 martie 2009 23:36:49
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define lm 60
#define cmax 200*lm*lm

int n, m, k, x1, y1, x2, y2, v[lm][lm], a[200][lm][lm], d[200], s[12010], nd;
int x[cmax], y[cmax], b[cmax];
int v1[4]={0,0,1,-1};
int v2[4]={1,-1,0,0};

int cmmdc(int a, int b)
{
	int k=a%b;
	while (k)
	{
	    a=b;
		b=k;
		k=a%b;
    }
	return b;
}

int solve()
{
    int i, p, h, l, c, f;
	h=1;
	f=s[cmmdc(v[x1][y1],k)];
	x[1]=x1;
	y[1]=y1;
	b[1]=f;
	a[f][x1][y1]=1;
	for (p=1; p<=h; p++)
	{
	    for (i=0; i<4; i++)
        {
			l=x[p]+v1[i];
			c=y[p]+v2[i];
			if (l<=n && c<=m && l && c)
			{
			    if (v[l][c])
				{
				    f=d[b[p]]*v[l][c];
					f=s[cmmdc(f,k)];
                    if ((!a[f][l][c])|(a[b[p]][x[p]][y[p]]+1<a[f][l][c]))
                    {
    		    	    h++;
				        x[h]=l;
    	  			    y[h]=c;
	           		    b[h]=f;
		           	    a[f][l][c]=a[b[p]][x[p]][y[p]]+1;
                    }
                }
            }
        }
    }
	return a[nd][x2][y2];
}

int main()
{
    freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	scanf("%d %d %d",&n,&m,&k);
	scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
	int i, j;
	for (i=1; i<=n; i++)
		for (j=1; j<=m; j++) scanf("%d",&v[i][j]);
    for (i=1; i<=k; i++)
	    if (!(k%i))
		{
		    d[1+nd++]=i;
			s[i]=nd;
        }
    printf("%d",solve());
}