Cod sursa(job #730707)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 6 aprilie 2012 19:32:12
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb

#include <cstdio>
#include <fstream>
#include <queue>

using namespace std;

#define f first
#define s second
#define mp make_pair

const int di[]={0,0,1,-1},
		  dj[]={-1,1,0,0};
int a[64][64],bst[64][64][256],v[12001],dv[256],n,m,k;
pair<int,int> start,finish;
queue<pair<int,pair<int,int> > > q; 

void read ()
{
	ifstream in ("kdrum.in");
	in>>n>>m>>k>>start.f>>start.s>>finish.f>>finish.s;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			in>>a[i][j];
}

bool in_m (int i,int j){
	return i<=n&&i>0&&j<=m&&j>0;}

int cmmdc (int x,int y)
{
	if(!y)
		return x;
	return cmmdc(y,x%y);
}

void solve ()
{
	for(int i=1;i<=k;++i)
		if(n%i==0)
		{
			dv[++dv[0]]=i;
			v[i]=dv[0];
		}
	bst[start.f][start.s][1]=1;
	for(q.push(mp(1,start));q.size();q.pop())
	{
		int d=q.front().f,x=q.front().s.f,y=q.front().s.s;
		for(int kk=0;kk<4;++kk)
		{
			int i=x+di[kk],j=y+dj[kk];
			if(in_m(i,j)&&a[i][j])
			{
				int d3=v[cmmdc(a[i][j]*dv[d],k)];
				if(bst[i][j][d3]==0)
				{
					q.push(mp(d3,mp(i,j)));
					bst[i][j][d3]=bst[x][y][d]+1;
				}
			}
		}
	}
}

void out ()
{
	freopen ("kdrum.out","w",stdout);
	printf("%d",bst[finish.f][finish.s][v[k]]);
}

int main ()
{
	read ();
	solve ();
	out ();
	return 0;
}