Cod sursa(job #464890)

Utilizator Marius96Marius Gavrilescu Marius96 Data 22 iunie 2010 12:57:47
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
/* 
 * File:   kdrum.cpp
 * Author: marius
 *
 * Created on June 21, 2010, 5:04 PM
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
struct str{
    int x,y,st;char *vv;
};
queue<str> q;
int b[35];int l;
char v[55][55][35];
char k[35];
int n,m,kk;
int MIN=-1;
int xx1,xx2,yy1,yy2;
void f(int x){
    if(kk%x==0){
        b[l]=x;
        while(kk%x==0){
            kk/=x;
            k[l]++;
        }
        l++;
    }
}
void sol(int x,int y, int st,char * vv){
    if(x>n||y>m||x==0||y==0||v[x][y][0]==-1)
        return;
    if(MIN!=-1&&st>=MIN)
        return;
    char * vvv=new char[l];
    memcpy(vvv,vv,l*sizeof(char));
    if(x==xx2&&y==yy2){
        for(int i=0;i<l;i++)
            if(vvv[i]){
                delete[] vvv;
                return;
            }
        MIN=st;
        delete[] vvv;
        return;
    }
    for(int i=0;i<l;i++)
        vvv[i]-=v[x][y][i];
    st++;
    str s;
    s.x=x-1;s.y=y;s.st=st;s.vv=vvv;
    q.push(s);
    s.x=x+1;
    q.push(s);
    s.x=x;s.y=y-1;
    q.push(s);
    s.y=y+1;
    q.push(s);
    delete[] vvv;
}
int main(int argc, char** argv) {
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);
    int x;
    scanf("%d%d%d",&n,&m,&kk);
    scanf("%d%d%d%d",&xx1,&yy1,&xx2,&yy2);
    f(2);
    int d=3;
    while(sqrt(kk)>=d){
        f(d);
        d+=2;
    }
    if(kk!=1)
        f(kk);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%d",&x);
            if(x==0){
                v[i][j][0]=-1;
                continue;
            }
            for(int ii=0;ii<l;ii++){
                while(x%b[ii]==0){
                    x/=b[ii];
                    v[i][j][ii]++;
                }
                if(x==1)
                    continue;
            }
        }
    sol(xx1,yy1,1,k);
    while(!q.empty()){
        str s=q.front();q.pop();
        sol(s.x,s.y,s.st,s.vv);
    }
    printf("%d",MIN);
    return (EXIT_SUCCESS);
}