Cod sursa(job #254349)

Utilizator DraStiKDragos Oprica DraStiK Data 7 februarie 2009 11:26:03
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.46 kb
#include <stdio.h>
#include <stdlib.h>
#define DIM 55
struct coada {int x,y;} c[5*DIM];
int dx[4]={1,0,-1, 0};
int dy[4]={0,1, 0,-1};
int a[DIM][DIM],b[DIM][DIM];
int n,m,k,x1,y1,x2,y2,min=DIM*DIM*DIM;
void read ()
{
    int i,j;
    scanf ("%d%d%d%d%d%d%d",&n,&m,&k,&x1,&y1,&x2,&y2);
    for (i=1; i<=n; ++i)
        for (j=1; j<=m; ++j)
        {
            scanf ("%d",&a[i][j]);
            if (!a[i][j])
                b[i][j]=-1;
        }
    for (i=1; i<=n; ++i)
		b[i][0]=b[i][m+1]=-1;
	for (i=1; i<=m; ++i)
		b[0][i]=b[n+1][i]=-1;
}
void lee (int pas,int i,int j)
{
    coada t;
    int in,sf,l;
    in=sf=1;
    c[in].x=i;
    c[in].y=j;
    b[i][j]=pas;
    while (in<=sf)
    {
		t=c[in%(5*DIM)];
	    ++in;
        for (l=0; l<4; ++l)
			if (b[t.x+dx[l]][t.y+dy[l]]!=-1)
            {
                b[t.x+dx[l]][t.y+dy[l]]=b[t.x][t.y]+1;
                ++sf;
                c[sf%(5*DIM)].x=t.x+dx[l];
				c[sf%(5*DIM)].y=t.y+dy[l];
				if (t.x+dx[l]==x2 && t.y+dy[l]==y2)
				{
						printf ("%d",b[t.x+dx[l]][t.y+dy[l]]);
						exit (0);
				}
			}
	}
}
void back (int i,int j,int p,int pas)
{
	int l;
	p*=a[i][j];
	if (p%k==0)
		lee (pas,i,j);
	else
		for (l=0; l<4; ++l)
			if (b[i+dx[l]][j+dy[l]]!=-1)
				back (i+dx[l],j+dy[l],p,pas+1);
}
int main ()

{
	freopen ("kdrum.in","r",stdin);
	freopen ("kdrum.out","w",stdout);
	read ();
	if (k==1)
		lee (1,x1,y1);
	else
		back (x1,y1,1,1);
	return 0;
}