Cod sursa(job #222768)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 noiembrie 2008 08:56:06
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<stdio.h>
int main()
{
	readd();
	presolve();
	solve();
	return 0;
}
void readd()
{
	freopen("camp.in","r",stdin);
	freopen("camp.out","w",stdout);
	scanf("%d%d",&N,&M);
	scanf("%d%d",&K,&L);
	for(i=0;i<=N+1;i++) H[i][0]=H[i][M+1]='m';
	for(j=0;j<=M+1;j++) H[0][j]=H[N+1][j]='m';
	for(i=1;i<=N;i++)
	{ scanf("%s",LH);
	  for(j=1;j<=M;j++)H[i][j]=LH[j-1];
	}
}
void presolve()
{
	for(i=1;i<=N;i++)
	 for(j=1;j<=M;j++)
	 if(H[i][j]=='c'||H[i][j]=='p')
	 {
		go_nord_sud();
		go_est_vest();
	 }
}
void go_nord_sud()
{       for(k=1;;k++)if(H[i+k][j]!='a')break;
	if(H[i+k][j]=='m')return;
	s[i][j]=j+k;n[i][j+k]=j;
	if(k==1)
	{ if(H[i+1][j]>H[i][j]) { pps[i][j]=1;return;}
	  if(H[i+1][j]<H[i][j]) ppn[i+1][j]=1;
	  return;
	}
	pas[i][j]=pan[i+k][j]=1;
	if(H[i+k][j]=='p')pps[i][j]=1;
	if(H[i][j]=='p')ppn[i+k][j]=1;
}
void go_est_vest()
{       for(k=1;;k++)if(H[i][j+k]!='a')break;
	if(H[i][j+k]=='m')return;
	e[i][j]=j+k;v[i][j+k]=j;
	if(k==1)
	{ if(H[i][j+1]>H[i][j]) { ppe[i][j]=1;return;}
	  if(H[i][j+1]<H[i][j]) ppv[i][j+1]=1;
	  return;
	}
	pae[i][j]=pav[i][j+k]=1;
	if(H[i][j+k]=='p')ppe[i][j]=1;
	if(H[i][j]=='p')ppv[i][j+k]=1;
}
void solve()
{
	first=1;last=1;
	ok[1][1][0][0]=1;
	st[1].lin=1;st[1].col=1;st[1].pp=0;st[1].pa=0;
	for(;;)
	{ ic=st[first].lin;jc=st[first].col;
	  ppc=st[first].pp;pac=st[first].pa;
	  if(e[ic][jc])
	  { in=ic;jn=e[ic][jc];
	    ppn=ppc+ppe[ic][jc];
	    if(ppn<=K)
	    { pan=pac+pae[ic][jc];
	      if(pan<L)
	       if(!ok[in][jn][ppn][pan])
	       {   ok[in][jn][ppn][pan]=vest;
		   if(in==N&&jn==M){ pps=ppn;pas=pan;return;}
		   last++;
		   st[last].lin=in;st[last].col=jn;
		   st[last].pp=ppn;st[last].pa=pan;
	       }
	    }
	  }