Pagini recente » Cod sursa (job #1277232) | Cod sursa (job #1573574) | Cod sursa (job #488932) | Istoria paginii utilizator/vladbosulic109 | Cod sursa (job #222768)
Cod sursa(job #222768)
#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;
}
}
}