Cod sursa(job #433645)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 3 aprilie 2010 23:49:04
Problema Kdrum Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<stdio.h>
#define infile "kdrum.in"
#define outfile "kdrum.out"
#define nmax 51
#define nrmax 10
const int ii[]={-1,0,1,0};
const int jj[]={0,1,0,-1};
struct coada
{
	int i,j; //coordonatele
	int conf; //configuratia
} co[nmax*nmax*nrmax]; //coada
int dp[nmax][nmax][nrmax]; //dp[i][j][conf]=costul minim pana la (i,j) avand factorii primi din conf
int h[nmax][nmax]; //harta fetitei
int d[nrmax]; //descompunerea in factori primi a lui k
int n,m; //dimensiunea hartii
int k; //numarul cu care trebuie sa fie divizibil produsul de pe traseu
int xx1,yy1; //pozitia de start
int xx2,yy2; //pozitia finala
int nr; //numarul de factori primi din descompunerea lui k

int conf(int x)
{
	int conf=0,i;
	for(i=1;d[i]<=x && i<=nr;i++)
		if(x%d[i]==0)
			conf+=(1<<(i-1)), x/=d[i];
	return conf;
}

void read()
{
	int i,j;
	scanf("%d %d %d\n",&n,&m,&k);
	scanf("%d %d %d %d\n",&xx1,&yy1,&xx2,&yy2);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&h[i][j]);
}

void init()
{
	int i;
	
	//facem descompunerea lui k
	//in factori primi
	for(i=2;i<=k;i++)
		while(k%i==0)
			d[++nr]=i, k/=i;
}

void solve()
{
	int st,dr;
	int i,j,k,t;
	int x,y,z;
	
	//initializam coada
	st=dr=1, co[1].i=xx1, co[1].j=yy1, co[1].conf=conf(h[xx1][yy1]);
	dp[xx1][yy1][co[1].conf]=1;
	
	while(st<=dr)
	{
		i=co[st].i;
		j=co[st].j;
		k=co[st].conf;
		for(t=0;t<4;t++)
		{
			x=i+ii[t];
			y=j+jj[t];
			if(x>0 && x<=n && j>0 && j<=m && h[x][y])
			{
				z=k|conf(h[x][y]);
				if(!dp[x][y][z])
				{
					dp[x][y][z]=dp[i][j][k]+1;
					++dr, co[dr].i=x, co[dr].j=y, co[dr].conf=z;
					if(x==xx2 && y==yy2 && z==(1<<nr)-1) return;
				}
			}
		}
		st++;
	}
}

void write()
{
	printf("%d\n",dp[xx2][yy2][(1<<nr)-1]);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	solve();
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}