Cod sursa(job #254357)

Utilizator RobybrasovRobert Hangu Robybrasov Data 7 februarie 2009 11:28:16
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.12 kb
#include <cstdio>
#define inf (1<<30)-1
#define N 51

const int cx[4]={0,0,1,-1};
const int cy[4]={1,-1,0,0};
int A[N][N],E[N][N],n,m,i,j,k,x1,y1,x2,y2,minim;

inline int min(int a, int b)
{
    return (a<b?a:b);
}

void drum(int x, int y, int c, int p)
{
    if (x==x2 && y==y2)
        if (p%k==0) minim=min(minim,c);
        else;
    else
    {
        E[x][y]=1;
        int iu,ju,k;
        for (k=0; k<=3; k++)
        {
            iu=x+cx[k]; ju=y+cy[k];
            if (!E[iu][ju])
            {
                drum(iu,ju,c+1,p*A[iu][ju]);
                E[iu][ju]=0;
            }
        }
    }
}

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
    scanf("%d%d%d\n",&n,&m,&k);
    scanf("%d%d%d%d\n",&x1,&y1,&x2,&y2);
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++) scanf("%d",&A[i][j]);
    for (i=0; i<=n+1; i++)
    {
        E[i][0]=1;
        E[i][m+1]=1;
    }
    for (i=0; i<=m+1; i++)
    {
        E[0][i]=1;
        E[n+1][i]=1;
    }
    minim=inf;
    drum(x1,y1,1,A[x1][y1]);
    printf("%d",minim);

    return 0;
}