Cod sursa(job #254304)

Utilizator c_e_manuEmanuel Cinca c_e_manu Data 7 februarie 2009 11:01:15
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.65 kb
#include<cstdio>
#define INF 2000000000


long long a[52][52],b[52][52];
long long i,j,n,m,x[5]={0,0,1,0,-1},y[5]={0,-1,0,1,0},x1,y1,k;

void traseuk();

int main()
{       freopen("kdrum.in","r",stdin);
        freopen("kdrum.out","w",stdout);
        scanf("%lld%lld%lld",&n,&m,&k);
        scanf("%lld%lld",&x1,&y1);
        b[x1][y1]=1;
        scanf("%lld%lld",&x1,&y1);
        for(i=1;i<=n;i++)
                for(j=1;j<=m;j++)
                {       scanf("%lld",&a[i][j]);
                        if(a[i][j]==0)b[i][j]=INF;
                }
        for(i=0;i<=n+1;i++)
                b[i][0]=INF,b[i][m+1]=INF;
        for(i=0;i<=m+1;i++)
                b[0][i]=INF,b[n+1][i]=INF;
        if(k==1)
        {       traseuk();
                printf("%lld\n",b[x1][y1]);
        }
        else    printf("lld\n",n+m);
        return 0;
}
void traseuk()
{       int sw=0,ii,jj,min,k;
        while(!sw)
        {       sw=1;
                for(i=1;i<=n;i++)
                        for(j=1;j<=n;j++)
                                if(b[i][j]==0)
                                {       min=INF;
                                        for(k=1;k<=4;k++)
                                        {       ii=i+x[k];
                                                jj=j+y[k];
                                                if(b[ii][jj]<min&&b[ii][jj]!=0)
                                                        min=b[ii][jj];
                                        }
                                        if(min!=INF)
                                        {       b[i][j]=min+1;sw=0;}
                                }
        }
}