Pagini recente » Cod sursa (job #1914084) | Cod sursa (job #2441896) | Cod sursa (job #1406624) | Cod sursa (job #2734561) | Cod sursa (job #25459)
Cod sursa(job #25459)
#include<stdio.h>
#define maxn 351
#define maxp 301
long int a[27][maxn], poz[3][maxp];
long int x[5]={0,0,1,0,-1};
long int y[5]={0,-1,0,1,0};
long int n,m,p,d,S,xx,yy;
long int viz[27][maxn],c[27][maxn];
long int ok1;
void gol()
{long int i,j;
for(i=0;i<=m+1;i++)
for(j=1;j<=n;j++)
viz[i][j]=c[i][j]=0;
}
void solve()
{S=0;xx=1; yy=0;ok1=1;
long int q[3][10000],i;
long int cap,coada; cap=coada=1;
while (p)
{gol();
c[yy][xx]=S;
cap=coada=1;
q[1][1]=xx; q[2][1]=yy;
viz[yy][xx]=1;
long int ok=1;
while (cap<=coada && ok)
{long int ii,jj;
for(i=1;i<=4;i++)
{ii=q[1][cap]+x[i];
jj=q[2][cap]+y[i];
if((ii>=1)&&(ii<=n) && (jj>=0)&&(jj<=m+1)){if(!viz[jj][ii])
{if( ((q[2][cap]==m+1) && (jj==m+1)) ||((q[2][cap]==0)&&(jj==0)) )
{viz[jj][ii]=1;
c[jj][ii]=c[q[2][cap]][q[1][cap]]+d;
q[1][++coada]=ii; q[2][coada]=jj;
if(a[jj][ii]) {p-=a[jj][ii]; ok=0;S=c[jj][ii]; xx=ii;yy=jj;a[jj][ii]=0;}
}
else if(i==1 || i==3){viz[jj][ii]=1;
c[jj][ii]=c[q[2][cap]][q[1][cap]]+1;
q[1][++coada]=ii; q[2][coada]=jj;
if(a[jj][ii]) {p-=a[jj][ii]; ok=0;S=c[jj][ii];xx=ii;yy=jj;a[jj][ii]=0;}
}
}
else {if( ((q[2][cap]==m+1) && (jj==m+1)) ||((q[2][cap]==0)&&(jj==0)))
{if(c[jj][ii]>c[q[2][cap]][q[1][cap]]+d){c[jj][ii]=c[q[2][cap]][q[1][cap]]+d;
q[1][++coada]=ii; q[2][coada]=jj;
if(a[jj][ii]) {p-=a[jj][ii]; ok=0;S=c[jj][ii];xx=ii;yy=jj;a[jj][ii]=0;}
}
}
else if(i==1 || i==3) {if(c[jj][ii]>c[q[2][cap]][q[1][cap]]+1){c[jj][ii]=c[q[2][cap]][q[1][cap]]+1;
q[1][++coada]=ii; q[2][coada]=jj;
if(a[jj][ii]) {p-=a[jj][ii]; ok=0;S=c[jj][ii];xx=ii;yy=jj;a[jj][ii]=0;}
}
}
}
}
}
cap++;
}
if(p==0 && ok1){p=1; a[0][n]=1;ok1=0; }
}
}
int main ()
{long int i;
freopen("magazin.in","r",stdin);
scanf("%ld %ld %ld %ld\n",&p,&n,&m,&d);
for(i=1;i<=p;i++)
{scanf("%ld %ld\n",&poz[1][i],&poz[2][i]);
a[poz[2][i]][poz[1][i]]++;
}
solve();
freopen("magazin.out","w",stdout);
printf("%ld\n",S);
return 0; }