Cod sursa(job #1093010)

Utilizator roby2001Sirius roby2001 Data 27 ianuarie 2014 17:50:30
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
/*
          ~Keep It Simple!~
*/

#include<stdio.h>
#include<string.h>
#include<list>

using namespace std;


#define NMax 52
#define inf 20000

int N,M,k,x1,x2,yy1,y2,A[NMax][NMax],idx[12002],Lmin[NMax][NMax][305];
int divs[6000],nrd;

struct node { int x,y,idx; };

list< node > S;
bool viz[NMax][NMax];

int xi[] = {1,0,-1,0};
int yi[] = {0,-1,0,1};

int cmmdc(int a, int b)
{
	if(!b) return a;
	return cmmdc(b,a%b);
}

void InitDiv()
{
	for(int i = 1; i <= k/2; i++)
		if( k%i == 0 )
		{
			divs[++nrd] = i;
			idx[i] = nrd;
		}
	divs[++nrd] = k;
	idx[k] = nrd;
}

void BFS()
{
	S.clear();
	node T;
	T.x = x1; T.y = yy1; T.idx = cmmdc(A[x1][yy1],k);
	S.push_back(T);
	viz[x1][yy1] = 1;
	memset(Lmin,inf,sizeof(Lmin));
	Lmin[T.x][T.y][T.idx] = 1;
	while(S.size())
	{
		node nod = S.front();
		S.pop_front();
		viz[nod.x][nod.y] = 1;

		for(int i = 0; i<4; i++)
		{
			int xs = nod.x+xi[i];
			int ys = nod.y+yi[i];
			int p = idx[cmmdc( A[xs][ys] * divs[nod.idx] ,k)];
			if(A[xs][ys] && Lmin[nod.x][nod.y][nod.idx] + 1 < Lmin[xs][ys][p])
			{
				Lmin[xs][ys][p] = Lmin[nod.x][nod.y][nod.idx] + 1;
				node aux;
				aux.x = xs; aux.y = ys; aux.idx = p;
				S.push_back(aux);
			}
		}
	}

}

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);

	scanf("%d%d%d",&N,&M,&k);
    scanf("%d%d%d%d",&x1,&yy1,&x2,&y2);

	for(int i = 1; i <= N; i++)
		for(int j = 1; j <= M; j++)
			scanf("%d",&A[i][j]);

	InitDiv();
	BFS();

	printf("%d",Lmin[x2][y2][nrd]);

}