Cod sursa(job #266109)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 24 februarie 2009 21:44:50
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define lm 60
#define cmax 2000000
#define vm 3000

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

int lee()
{
	int it, i, j, h, l, c, p, k, t;
	for (it=1; it<=nd; it++)
    {
		h=1;
		x[1]=x1;
		y[1]=y1;
		if (!(v[x1][y1]%d[it]))
			a[it][x1][y1]=1;
        p=1;
		t=0;
		while (p<=h+t)
		{
			for (i=1; i<=4; i++)
			{
				l=x[p]+v1[i];
				c=y[p]+v2[i];
				if ((l>0)& (l<=n)& (c>0)& (c<=m)& (v[l][c]>0))
				{
					k=a[it][l][c];
					if (a[it][x[p]][y[p]]!=vm)
                        a[it][l][c]=min(a[it][l][c], a[it][x[p]][y[p]]+1);
					for (j=1; j<it; j++)
					    if ((!(d[it]%d[j]))& (!(v[l][c]%(d[it]/d[j])))&
                        (a[j][x[p]][y[p]]!=vm))
						    a[it][l][c]=min(a[it][l][c], a[j][x[p]][y[p]]+1);
					if ((k==vm)|(k!=a[it][l][c]))
					{
						h++;
						if (h>cmax)
						{
						    h=1;
							t+=cmax;
                        }
					    x[h]=l;
					    y[h]=c;
					}
                }
            }
			p++;
			if (p>cmax)
			{
			    p=1;
				t-=cmax;
            }
        }
    }
	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, it;
	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;
	for (it=0; it<=nd; it++)
	    for (i=0; i<=n; i++)
		    for (j=0; j<=m; j++) a[it][i][j]=vm;
	printf("%d",lee());
}