Cod sursa(job #274769)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 9 martie 2009 23:05:28
Problema Kdrum Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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[1210], 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, j, h, l, c, f;
	h=0;
    for (i=1; i<=nd; i++)
	    if (!(v[x1][y1]%d[i]))
		{
	        h++;
	        x[h]=x1;
	        y[h]=y1;
			b[h]=i;
	        a[i][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])
                    {
    		    	    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());
}