Cod sursa(job #254388)

Utilizator mariusdrgdragus marius mariusdrg Data 7 februarie 2009 11:49:14
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 2.18 kb
#include<stdio.h>
#include<map>
#include<vector>
#define pb push_back
#define mkp make_pair
using namespace std;

const int maxn = 60;
const int maxst = 450000;

const int X[5] = {0,1,0,-1};
const int Y[5] = {1,0,-1,0}; 

pair<pair<int,int>,int> ST[maxst];
int NRSTIVA,NRST,N,M,K,XST,YST,XFIN,YFIN;
int MAT[maxn][maxn],PUT[maxn][maxn][maxn],DI[maxn][maxn][200];
map <vector<int>,int > MA1;
map <int,vector<int> > MA;
vector<int> VECT;

void scade(int x,int y,vector<int> &aux)
{
	for(unsigned int i = 0;i < aux.size(); ++i)
		aux[i] -= PUT[x][y][i];
	for(unsigned int i = 0;i < aux.size(); ++i)
		aux[i] = max(aux[i],0);
}

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	scanf("%d %d %d\n",&N,&M,&K);
	scanf("%d %d %d %d\n",&XST,&YST,&XFIN,&YFIN);
	for(int i = 1;i <= N; ++i)
		for(int j = 1;j <= M; ++j)
			scanf("%d",&MAT[i][j]);
	int aux = K;
	for(int i = 2;i <= aux; ++i)
	{
		if (aux % i == 0)	
		{
			int cur = 0;
			while(aux % i == 0) {aux /= i;++cur;}
			VECT.pb(cur);
			for(int k = 1;k <= N; ++k)
				for(int j = 1;j <= M; ++j)
				{
					int aux = MAT[k][j];
					while(aux % i == 0 && aux > 0)
					{
						PUT[k][j][VECT.size() - 1]++;
						aux /= i;
					}
					PUT[k][j][VECT.size() - 1] = min(cur,PUT[k][j][VECT.size() - 1]);
				}
			VECT[VECT.size() - 1] -= PUT[XST][YST][VECT.size() - 1];
			VECT[VECT.size() - 1] = max(VECT[VECT.size() - 1],0);
		}
	}	
	DI[XST][YST][1] = 1;
	MA[++NRST] = VECT;
	MA1[VECT] = NRST;
	ST[++NRSTIVA] = mkp(mkp(XST,YST),NRST);
	for(int i = 1;i <= NRSTIVA; ++i)
	{
		int x = ST[i].first.first;
		int y = ST[i].first.second;
		int st = ST[i].second;
		for(int k = 0;k <= 3; ++k)
		{
			int x1 = x + X[k],y1 = y + Y[k];
			if (x1 < 1 || x1 > N || y1 < 1 || y1 > M || MAT[x1][y1] == 0)  continue;
			vector<int> aux = MA[st];
			scade(x1,y1,aux);
			if (MA1.find(aux) == MA1.end()) 
			{
				MA[++NRST] = aux;
				MA1[aux] = NRST;	
			}
			int stnou = MA1[aux];
			if (DI[x1][y1][stnou] == 0)
			{
				DI[x1][y1][stnou] = DI[x][y][st] + 1;
				ST[++NRSTIVA] = mkp(mkp(x1,y1),stnou);				
			}
		}
	}
	vector<int> ans;
	for(unsigned int i = 0;i < VECT.size(); ++i)
		ans.pb(0);
	int st = MA1[ans];
	printf("%d\n",DI[XFIN][YFIN][st]);
	return 0;
}