Cod sursa(job #994799)

Utilizator enedumitruene dumitru enedumitru Data 6 septembrie 2013 13:07:16
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
#define ll long long
#define INF 2000000000
using namespace std;
ifstream f("kdrum.in"); ofstream g("kdrum.out");
int n,m,k,nrd,xp,yp,xf,yf;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int ord[12001],a[52][52],dist[61][61][101];
struct art {int x,y,z;} q[300005];
int cmmdc(ll a,ll b)
{ while(b)
	{ll r=a%b; a=b; b=r;}
	return a;
}	
int main ()
{   int i,j,z,px,py,xx,yy,p,u,SD,D,w;
    f>>n>>m>>k>>xp>>yp>>xf>>yf;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f>>a[i][j];
    nrd=0;      
    for(i=1;i<=k;i++)
        if(!(k%i))
            ord[i]=++nrd;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            for(z=1;z<=nrd;z++)
                dist[i][j][z]=INF;
    q[1].x=xp; q[1].y=yp; q[1].z=1;
    p=u=w=1; dist[xp][yp][1]=1; 
    while(w)
    {   px=q[p].x; py=q[p].y; D=q[p].z;
        for(i=0;i<4 && w;i++)
        {   xx=px+dx[i]; yy=py+dy[i];
            if(a[xx][yy])
            {	SD=cmmdc((ll)k,(ll)D*a[xx][yy]);                
				if(dist[px][py][ord[D]] + 1 < dist[xx][yy][ord[SD]]) 
				{	dist[xx][yy][ord[SD]]=dist[px][py][ord[D]] + 1;
					q[++u].x=xx; q[u].y=yy; q[u].z=SD;
					if(xx==xf && yy==yf && SD==k) w=0;
				}
			}
        }
        p++;
    }
	g<<dist[xf][yf][ord[k]]<<'\n'; g.close(); return 0;
}