Cod sursa(job #431594)

Utilizator gyeresihunorGyeresi Hunor gyeresihunor Data 1 aprilie 2010 10:42:38
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include<stdio.h>

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

int y[100][2];

int t[52][52][2]={0};
struct ww
{
	int ok;
	int bi;
	int ji;
	int xx;
	int yy;
	ww()
	{
		bi=-1;
		ji=-1;
	}
}
u[2500];
int n,m,k,x1,y1,x2,y2;
int e=1;
int min=65000;

//void bontas(int &k, int h)
//void keres(int &p);
void insert( int a , int i , int x , int y );
int lee( int x , int y , int nr , int k );
//int bont(int n);
int main()
{
	int i,j;
	fscanf(f,"%d%d%d%d%d%d%d",&n,&m,&k,&x1,&y1,&x2,&y2);
	for(i=0;i<=n+1;i++)
		for(j=0;j<=m+1;j++)
			if(i==0||i==n+1||j==0||j==m+1)t[i][j][1]=-1;
			else fscanf(f,"%d",&t[i][j][0]);
		t[1][1][1]=1;
	if( t[x1-1][ y1 ][1]==0 && t[x1-1][ y1 ][0]!=0 )lee(x1-1, y1 ,2,k);
	if( t[x1+1][ y1 ][1]==0 && t[x1+1][ y1 ][0]!=0 )lee(x1+1, y1 ,2,k);
	if( t[ x1 ][y1-1][1]==0 && t[ x1 ][y1-1][0]!=0 )lee( x1 ,y1-1,2,k);
	if( t[ x1 ][y1+1][1]==0 && t[ x1 ][y1+1][0]!=0 )lee( x1 ,y1+1,2,k);
	fprintf(g,"%d",min);
	fclose(f);
	fclose(g);
	return 0;
}

int lee( int x , int y , int nr , int k)
{
	t[x][y][1]=nr;
	//if(k>1)insert(t[x][y][0],0,x,y);
	if(k%t[x][y][0]==0)k/=t[x][y][0];
	//else bontas(k,t[x][y][0]);
	
	if(x==x2&&y==y2)
	{
		if(k==1&&min>nr)
		{
			min=nr;
			return 0;
		}
		/*
		else 
		{
			p=k;
			d=0;
			while(p!=1)
			{
				p/=bont(p);
				d++;
				if(p!=1)
					keres(p);
			}
		}*/
	}
	else
	{
	if( (t[x-1][ y ][1]==0||t[x-1][ y ][1]>nr) &&(t[x-1][ y ][0]!=0))  lee(x-1, y ,nr+1,k);
	if( (t[x+1][ y ][1]==0||t[x+1][ y ][1]>nr) &&(t[x+1][ y ][0]!=0))  lee(x+1, y ,nr+1,k);
	if( (t[ x ][y-1][1]==0||t[ x ][y-1][1]>nr) &&(t[ x ][ y-1 ][0]!=0))lee( x ,y-1,nr+1,k);
	if( (t[ x ][y+1][1]==0||t[ x ][y+1][1]>nr) &&(t[ x ][ y+1 ][0]!=0))lee( x ,y+1,nr+1,k);
	t[x][y][1]=0;
	}
	return 0;
}

void insert( int a , int i , int x , int y )
{
	if(a<u[i].ok)
	{
		if(u[i].bi==-1)
		{
			u[e].ok=a;
			u[i].bi=e;
			u[e].xx=x;
			u[e].yy=y;
			e++;
		}
		else insert(a,u[i].bi,x,y);
	}
	if(u[i].ok<=a)
	{
		if(u[i].ji==-1)
		{
			u[e].ok=a;
			u[i].ji=e;
			u[e].xx=x;
			u[e].yy=y;
			e++;
		}
		else insert(a,u[i].ji,x,y);
	}
}
/*
int bont(int n)
{
	for(i=2;i<sqrt(n);i++)
		if(n%i==0)
			return n/i;
	return n;
}

int keres( int a , int i )
{
	if(u[i].ok==a)return i;
	if(a<u[i].ok)
	{
		if(u[i].bi==-1)return -1;
		else return keres(a,u[i].bi);
	}
	else
	{
		if(u[i].ji==-1)return -1;
		else return keres(a,u[i].ji);
	}
	return -1;
}

void bontas(int &k, int h)
{
	for(int i=2;i<k/2;i++)
	{
		while(k%i==0&&h%i==0)
		{
			k/=i;
			h/=i;
		}
	}
}
*/