Cod sursa(job #254540)

Utilizator katakunaCazacu Alexandru katakuna Data 7 februarie 2009 12:50:01
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 2.27 kb
#include<stdio.h>
#define INF 1<<30
#include<string.h>
#include<algorithm>
using namespace std;

int c2[3][55*55],viz2[55][55],q,sol,k,i,j,n,m,a[55][55],viz[55][55],c[4][55*55],p,u,x1,x2,y1,y2,x,y;
int d[2][4]={{1,0,-1,0},{0,1,0,-1}};
//int cd[1000001];

int unu(int x1,int y1){
int i;
p=1;
u=1;
c2[0][p] = x1;
c2[1][p] = y1;
c2[2][p] = 1;

   for(i=1;i<=n;i++)
      memset(viz2[i],0,sizeof(viz2[i]));


viz2[x1][y1] = 1;

   while(p <= u){
      for(i=0; i<=3; i++){
      x = c2[0][p] + d[0][i];
      y = c2[1][p] + d[1][i];

          if( x>0 && y>0 && x<=n && y<=m && a[x][y] && ! viz2[x][y]){
          viz2[x][y] = 1;
          u++;
          c2[0][u] = x;
          c2[1][u] = y;
          c2[2][u] = c2[2][p] + 1;
              if(x == x2 && y == y2)
              return c2[2][u];
          }
          
      }
   p++;
   }

return 0;
}

int cmmdc(int a,int b){
int r;

   while(b){
   r=a%b;
   a=b;
   b=r;
   }

return a;
}


int doi(){
int i,rez = INF;
p=1;
u=1;
c[0][p] = x1;
c[1][p] = y1;
c[2][p] = 1;
c[3][p] = k / cmmdc(a[x1][y1],k);
viz[x1][y1] = 1;

   while(p <= u){
      for(i=0; i<=3; i++){
      x = c[0][p] + d[0][i];
      y = c[1][p] + d[1][i];

          if( x>0 && y>0 && x<=n && y<=m && a[x][y] && ! viz[x][y]){
          viz[x][y] = 1;
          u++;
          c[0][u] = x;
          c[1][u] = y;
          c[2][u] = c[2][p] + 1;
          c[3][u] = k / cmmdc(a[x][y],c[3][p]);
              if(c[3][u] == 1){
                 q=unu(c[0][u],c[1][u]);
                 if(q + c[2][u] - 1 < rez)
                    rez=q + c[2][u] - 1;
              }
          }
          
      }
   p++;
   }

return rez;
}



int main(){

   FILE *f=fopen("kdrum.in","r");
   FILE *g=fopen("kdrum.out","w");

   fscanf(f,"%d %d",&n,&m);
   fscanf(f,"%d",&k);
   fscanf(f,"%d %d %d %d",&x1,&y1,&x2,&y2);

   for(i=1; i<=n; i++){
      for(j=1; j<=m; j++)
         fscanf(f,"%d",&a[i][j]);
         //if(a[i][j] > vmax)
           //vmax=a[i][j];
      }

   if(k == 1){
      sol = unu(x1,y1);
   }

   else{
      //for(i=1; i<=vmax; i++)
        //cd[i] = cmmdc(i,k);
      
      sol = doi();
   }

   fprintf(g,"%d",sol);
   fclose(f);
   fclose(g);
   return 0;
}