Cod sursa(job #254718)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 7 februarie 2009 13:52:17
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 3.31 kb
#include<stdio.h>
struct nod{int ii,jj,tt,kk;nod *urm;};
nod *prim,*ultim,*paux;
int n,m,k,i,j,i1,j1,i2,j2,a[55][55],t2[55][55],t1[55][55],cmmdc(int mic,int mare),
tsol1,tsol=2000000000;
void readd(),timp2(),timp1();
int main()
{
	readd();
	timp2();
	if(k==1){printf("%d\n",t2[i1][i2]);return 0;}
	timp1();
	return 0;
}
void readd()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	scanf("%d%d%d%d",&i1,&j1,&i2,&j2);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j])
				a[i][j]=cmmdc(a[i][j],k);
		}
}
int cmmdc(int mare,int mic)
{
	int rest;
	while(mic){rest=mare%mic;mare=mic;mic=rest;}
	return mare;
}
void timp2()
{   int ic,jc,tc,in,jn,tn;
	prim=new nod;
	prim->tt=1;
	prim->ii=i2;
	prim->jj=j2;
	prim->urm=0;
	ultim=prim;
	for(i=0;i<=n+1;i++)t2[i][0]=t2[i][m+1]=1;
	for(j=0;j<=m+1;j++)t2[0][j]=t2[n+1][j]=1;
	while(prim)
	{
		ic=prim->ii;
		jc=prim->jj;
		tc=prim->tt;
		in=ic+1;jn=jc;tn=tc+1;
		if(a[in][jn]&&!t2[in][jn])
		{
			t2[in][jn]=tn;
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
		}
		in=ic-1;jn=jc;
		if(a[in][jn]&&!t2[in][jn])
		{
			t2[in][jn]=tn;
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
		}
		in=ic;jn=jc+1;
		if(a[in][jn]&&!t2[in][jn])
		{
			t2[in][jn]=tn;
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
		}
		in=ic;jn=jc-1;
		if(a[in][jn]&&!t2[in][jn])
		{
			t2[in][jn]=tn;
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
		}
		prim=prim->urm;
	}
}
void timp1()
{
	int ic,jc,tc,kc,in,jn,tn,kn;
	prim=new nod;
	prim->tt=1;
	prim->ii=i1;
	prim->jj=j1;
	prim->kk=k;
	prim->urm=0;
	ultim=prim;
	while(prim)
	{
		ic=prim->ii;
		jc=prim->jj;
		tc=prim->tt;
		kc=prim->kk;
		if(tc>=tsol){prim=prim->urm;continue;}
		in=ic+1;jn=jc;tn=tc+1;
		if(a[in][jn])
		{
			kn=kc/cmmdc(kc,a[in][jn]);
			if(kn==1)
			{ tsol1=tc+t2[in][jn];
			  tsol=(tsol<tsol1)?tsol:tsol1;
			}
			else
		    {	
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->kk=kn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
			}
		}
		in=ic-1;jn=jc;
		{
			kn=kc/cmmdc(kc,a[in][jn]);
			if(kn==1)
			{ tsol1=tc+t2[in][jn];
			  tsol=(tsol<tsol1)?tsol:tsol1;
			}
			else
		    {	
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->kk=kn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
			}
		}
		in=ic;jn=jc+1;
		{
			kn=kc/cmmdc(kc,a[in][jn]);
			if(kn==1)
			{ tsol1=tc+t2[in][jn];
			  tsol=(tsol<tsol1)?tsol:tsol1;
			}
			else
		    {	
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->kk=kn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
			}
		}
		in=ic;jn=jc-1;
		{
			kn=kc/cmmdc(kc,a[in][jn]);
			if(kn==1)
			{ tsol1=tc+t2[in][jn];
			  tsol=(tsol<tsol1)?tsol:tsol1;
			}
			else
		    {	
			paux=new nod;
			paux->ii=in;
			paux->jj=jn;
			paux->tt=tn;
			paux->kk=kn;
			paux->urm=0;
			ultim->urm=paux;
			ultim=paux;
			}
		}
		prim=prim->urm;
	}
}