Cod sursa(job #254289)

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

{
	freopen ("kdrum.in","r",stdin);
	freopen ("kdrum.out","w",stdout);
	read ();
	if (k==1)
		lee (1,x1,y1);
	else
	{
		uz[x1][y1]=1;
		b[x1][y1]=-1;
		back (x1,y1,1,1);
		printf ("%d",min);
    }
    return 0;
}