Cod sursa(job #254366)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 7 februarie 2009 11:31:44
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 2.78 kb
#include<stdio.h>
#define N 55
const int dx[]={0,0,-1,1};
const int dy[]={1,-1,0,0};
int a[N][N],nr[N][N],n,m,k,p1[N][N],d[N][N],ok,min=N*N,f;
void bfs1(int x0[2])
{
	int coada[N*N][2],x[2],y[2],u,p; 
	u=p=0;
	coada[u][0]=x0[0];
	coada[u++][1]=x0[1];
	nr[x0[0]][x0[1]]=1;
	p1[x0[0]][x0[1]]=1;
	d[x0[0]][x0[1]]=1;
	while (u!=p)
	{
		x[0]=coada[p][0];
		x[1]=coada[p++][1];
		for (int i=0; i<4; ++i)
		{
			y[0]=x[0]+dx[i];
			y[1]=x[1]+dy[i];
			if (d[y[0]][y[1]]==1+d[x[0]][x[1]])   
                nr[y[0]][y[1]]=nr[y[0]][y[1]]+nr[x[0]][x[1]]; 
			if (!d[y[0]][y[1]]&&a[y[0]][y[1]])
			{
				coada[u][0]=y[0];
				coada[u++][1]=y[1];
				nr[y[0]][y[1]]=nr[x[0]][x[1]];
				if (p1[x[0]][x[1]]%k)
					p1[y[0]][y[1]]*=p1[x[0]][x[1]];
				else
				{ 
					ok=1;
					p1[y[0]][y[1]]=p1[x[0]][x[1]];
				}
				d[y[0]][y[1]]=1+d[x[0]][x[1]];
			}
		}
	}
}
void bfs2(int x0[2],int y0[2])
{
	int coada[N*N][2],x[2],y[2],u,p; 
	u=p=0;
	coada[u][0]=x0[0];
	coada[u++][1]=x0[1];
	--nr[x0[0]][x0[1]];
	p1[x0[0]][x0[1]]=1;
	d[x0[0]][x0[1]]=1;
	while (u!=p)
	{
		x[0]=coada[p][0];
		x[1]=coada[p++][1];
		for (int i=0; i<4; ++i)
		{
			y[0]=x[0]+dx[i];
			y[1]=x[1]+dy[i];
			if (nr[y[0]][y[1]]&&!d[y[0]][y[1]])
			{
				coada[u][0]=y[0];
				coada[u++][1]=y[1];
				--nr[y[0]][y[1]];
				if (p1[x[0]][x[1]]%k)
					p1[y[0]][y[1]]*=p1[x[0]][x[1]];
				else
				{ 
					ok=1;
					p1[y[0]][y[1]]=p1[x[0]][x[1]];
				}
				d[y[0]][y[1]]=1+d[x[0]][x[1]];
			}
		}
		if (d[y0[0]][y0[1]])
		{
			--nr[y0[0]][y0[1]];
			if (p1[y0[0]][y0[1]]%k==0)
				if (min>d[y0[0]][y0[1]])
					min=d[y0[0]][y0[1]];
		}
	}
}
void citire()
{
	int x[2],y[2];
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	scanf("%d%d%d%d%d%d%d",&n,&m,&k,&x[0],&x[1],&y[0],&y[1]);
	for (int i=1; i<=n; ++i)
		for (int j=1; j<=m; ++j)
		{
			scanf("%d",&a[i][j]);
			p1[i][j]=a[i][j];
			if (!a[i][j]) ++f;
		}
	for (int i=0;i<=n+1; ++i)   
    {   
        d[0][1]=nr[0][i]=-1;   
        d[n+1][i]=nr[n+1][i]=-1;   
    }   
    for (int i=0; i<=m+1; ++i)   
    {   
        d[i][0]=nr[i][0]=-1;   
        d[i][m+1]=nr[i][m+1]=-1;   
    }   
	bfs1(x);
	if (p1[y[0]][y[1]]%k==0 || ok)
		printf("%d\n",d[y[0]][y[1]]);
	else
	{
		for (int i=1; i<=n; ++i) for (int j=1; j<=m; ++j) {p1[i][j]=a[i][j];d[i][j]=0;}
		while (nr[y[0]][y[1]])
		{
			nr[x[0]][x[1]]=1;
			bfs2(x,y);
		}
		if (min == 3025) printf("%d\n",m*n-f);else
		printf("%d\n",min);
	}
}
void afis()
{
	for (int i=1; i<=n; ++i)
	{
		for (int j=1; j<=m; ++j)
				printf("%d ",p1[i][j]);
		printf("\n");
	}
	printf("\n\n");
	for (int i=1; i<=n; ++i)
	{
		for (int j=1; j<=m; ++j)
				printf("%d ",nr[i][j]);
		printf("\n");
	}
}
int main()
{
	citire();
	//afis();
	return 0;
}