Cod sursa(job #1092257)

Utilizator roby2001Sirius roby2001 Data 26 ianuarie 2014 19:41:30
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
/*
          ~Keep It Simple!~
*/

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

using namespace std;


#define NMax 52

int N,M,k,x1,x2,yy1,y2,A[NMax][NMax],idx[NMax][NMax],Lmin[NMax][NMax];
int divs[6000],nrd;
list< pair<int,int> > 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;
	divs[++nrd] = k;
}

void BFS()
{
	S.clear();
	S.push_back(make_pair(x1,yy1));
	idx[x1][yy1] = cmmdc(A[x1][x2],k);
	viz[x1][yy1] = 1;

	int level = 0;
	while(S.size())
	{
		pair<int,int> nod = S.front();
		S.pop_front();
		viz[nod.first][nod.second] = 1;
		level = Lmin[nod.first][nod.second]+1;

		for(int i = 0; i<4; i++)
		{
			if(A[nod.first+xi[i]][nod.second+yi[i]])
			{
				if( nod.first + xi[i] == x2 && nod.second + yi[i] == y2)
				{
					int x = cmmdc(idx[nod.first][nod.second] * A[nod.first+xi[i]][nod.second+yi[i]],k);
					if( x == k )
					{
					    idx[nod.first+xi[i]][nod.second+yi[i]] = x;
					    Lmin[nod.first+xi[i]][nod.second+yi[i]] = level;
				    	S.push_back(make_pair(nod.first+xi[i],nod.second+yi[i]));
					}
				}
				else if(!viz[nod.first+xi[i]][nod.second+yi[i]])
				{
					idx[nod.first+xi[i]][nod.second+yi[i]] = cmmdc(idx[nod.first][nod.second] * A[nod.first+xi[i]][nod.second+yi[i]],k);
					Lmin[nod.first+xi[i]][nod.second+yi[i]] = level;
					S.push_back(make_pair(nod.first+xi[i],nod.second+yi[i]));
				}
	/*			else
					if( Lmin[nod.first+xi[i]][nod.second+yi[i]] > level )
					{
					    idx[nod.first+xi[i]][nod.second+yi[i]] = cmmdc(idx[nod.first][nod.second] * A[nod.first+xi[i]][nod.second+yi[i]],k);
						Lmin[nod.first+xi[i]][nod.second+yi[i]] = level;
						S.push_back(make_pair(nod.first+xi[i],nod.second+yi[i]));
					}
					*/
			}
		}
	}

}

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]+1);

}