Cod sursa(job #254306)
Utilizator | Data | 7 februarie 2009 11:02:54 | |
---|---|---|---|
Problema | Kdrum | Scor | 20 |
Compilator | cpp | Status | done |
Runda | Stelele Informaticii 2009, clasele 9-10, ziua 2 | Marime | 1.66 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;}
}
}
}