Cod sursa(job #25459)

Utilizator lucibitLucian Onea lucibit Data 4 martie 2007 12:39:33
Problema Magazin Scor 15
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasele 11-12 Marime 2.59 kb
#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; }