Cod sursa(job #978582)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 29 iulie 2013 01:10:52
Problema Kdrum Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 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;
}