Cod sursa(job #264752)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 22 februarie 2009 18:18:15
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int dx[4]={-1,0,1,0},
          dy[4]={0,1,0,-1},
          Inf=2000000000;
int N,M,K,a[55][55],x1,y1,x2,y2;
vector<int> Div,d[55][55];
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int cmmdc(int x,int y){
    return y!=0?cmmdc(y,x%y):x;
    }
struct stare{
       int x,y,p;
       stare(){}
       stare(int x,int y,int p){
         this->x=x;
         this->y=y;
         this->p=p;
         }
       };
queue<stare> Q;
int I[12021];
int main(){
    int i,j,xx,yy,pp;
    f>>N>>M>>K;
    f>>x1>>y1>>x2>>y2;
    for (i=1;i<=N;++i)
     for (j=1;j<=M;++j){
         f>>a[i][j];
         a[i][j]=cmmdc(a[i][j],K);
         }
    
    for (i=1;i<=K;++i)
     if (K%i==0){
      Div.push_back(i);
      I[i]=Div.size()-1;
      }
     
    for (i=1;i<=N;++i)
     for (j=1;j<=M;++j)
      d[i][j].resize(Div.size(),Inf);
    
    d[x1][y1][I[a[x1][y1]]]=1;
    Q.push(stare(x1,y1,I[a[x1][y1]]));
    for (;!Q.empty();Q.pop()){
        stare S=Q.front();
        for (i=0;i<4;++i){
          xx=S.x+dx[i];
          yy=S.y+dy[i];
          if (xx<1 || xx>N) continue;
          if (yy<1 || yy>M) continue;
          pp=I[cmmdc(Div[S.p]*a[xx][yy],K)];
          if (d[S.x][S.y][S.p]+1<d[xx][yy][pp])
            {
             d[xx][yy][pp]=d[S.x][S.y][S.p]+1;
             Q.push(stare(xx,yy,pp));
            }
          }
        }
    
    g<<d[x2][y2][I[K]];                                            
    
    return 0;
}